搜索
bottom↓
回复: 24

SMT32 MDK 环境关于 volatile 变量出错 什么原因

[复制链接]

出0入0汤圆

发表于 2017-2-14 10:21:49 | 显示全部楼层 |阅读模式
项目中从NAND flash 读出的的临时数组 数据经常变化怎么办
比如定义
NAND_ADDRESS HandAddr;//片外手动操作地址
uint8_t HandBuffer [200]; //手动操作临时数组
还有类似的别的存储,
在查询别的NANFLASH地址数据时候, 经常把
HandBuffer [200];  里边的内容改变, 至今不知什么原因,
想了办法
把数据定义成
volatile  uint8_t HandBuffer [200]; //手动操作临时数组 ,
在另外一个文件是使用HandBuffer [200];
extern volatile  uint8_t HandBuffer [200]; //手动操作临时数组 ,

可是编辑出现警告什么原因
..\..\User\Ethernet\Internet\tcp_demo.c(1192): warning:  #167-D: argument of type "volatile uint8_t *" is incompatible with parameter of type "uint8_t *"
..\..\User\Ethernet\Internet\tcp_demo.c(1205): warning:  #167-D: argument of type "volatile uint8_t *" is incompatible with parameter of type "void *restrict"

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2017-2-14 10:35:57 | 显示全部楼层
查一下是不是指针越界了

两个警告是指数据类型不符

出0入0汤圆

发表于 2017-2-14 11:11:34 | 显示全部楼层
下数据写断点,就知道是谁写穿了。

出0入0汤圆

发表于 2017-2-14 11:16:48 | 显示全部楼层
定义的时候加volatile就可以了, extern volatile 那里volatile不要加。 另外voliate并没有防止内容被改变的作用。

出0入0汤圆

 楼主| 发表于 2017-2-14 13:43:06 | 显示全部楼层
flamma 发表于 2017-2-14 11:16
定义的时候加volatile就可以了, extern volatile 那里volatile不要加。 另外voliate并没有防止内容被改变 ...

试了一下,在源文件中直接定义  uint8_t HandBuffer [200];
在执行 FSMC_NAND_ReadSmallPage (  HandBuffer, HandAddr, 1); 报同样的错误

出0入0汤圆

发表于 2017-2-14 14:38:16 | 显示全部楼层
jiangzhimin 发表于 2017-2-14 13:43
试了一下,在源文件中直接定义  uint8_t HandBuffer [200];
在执行 FSMC_NAND_ReadSmallPage (  HandBuff ...

我前面不是说过了吗,volatile对你变量被改写的问题不起任何作用。莫名被改写一般是有内存写越界的情况。

出0入0汤圆

 楼主| 发表于 2017-2-14 15:10:08 | 显示全部楼层
flamma 发表于 2017-2-14 14:38
我前面不是说过了吗,volatile对你变量被改写的问题不起任何作用。莫名被改写一般是有内存写越界的情况。 ...

谢谢你的指点。
定义了数组是200个
下角标最大是[117]个,应该不是越界,
因为在查询别的 NANDFLASH 数据  有的能改写HandBuffer [200]; 数组里的变量, 有的不能改写
愁人, 现在用最笨的方法, 用之前要进行从NANDFLASH 读一遍。

出0入0汤圆

发表于 2017-2-14 16:31:58 | 显示全部楼层
程序里是不是有uint8_t类型的变量赋值给了HandBuffer[x]?

出0入0汤圆

 楼主| 发表于 2017-2-14 19:22:05 | 显示全部楼层
arm 发表于 2017-2-14 16:31
程序里是不是有uint8_t类型的变量赋值给了HandBuffer[x]?

没有别的变量给HandBuffer[x] 赋值啊

出0入0汤圆

 楼主| 发表于 2017-2-14 19:23:53 | 显示全部楼层
现在是从NANDFLASH 读出的数组  变量
里边的内容会改变, 这个问题怎么解决啊,各位大神请教下

出0入0汤圆

 楼主| 发表于 2017-2-15 08:30:22 | 显示全部楼层
想了个办法是对NANDFLLASH  在主体循环中不断的读取,这是个笨的办法,
各位大师,NANDFLASH 进行读取,理论上应该是无数,但是这种情况能对NANDFLASH 有一定损害吗?
擦除和写对NANDFLASH有一定的伤害是一定的

出0入8汤圆

发表于 2017-2-15 08:45:25 | 显示全部楼层
jiangzhimin 发表于 2017-2-15 08:30
想了个办法是对NANDFLLASH  在主体循环中不断的读取,这是个笨的办法,
各位大师,NANDFLASH 进行读取,理 ...

你应该根据前面坛友的建议,去抓下问题。

问题的本质,就是内存被篡改了,看看是否越界,指针指向错误等,你要去 debug,逐步排除可疑因素,这要靠你自己努力了。
找到问题后,可以来分享下,现阶段,靠这些信息,信息量不够,别人真心帮不了你什么。

出0入0汤圆

发表于 2017-2-15 08:46:48 | 显示全部楼层
..\..\User\Ethernet\Internet\tcp_demo.c(1205): warning:  #167-D: argument of type "volatile uint8_t *" is incompatible with parameter of type "void *restrict"

是不是类型不一样,8位/32位操作了

出0入8汤圆

发表于 2017-2-15 08:53:11 | 显示全部楼层
能在线 debug 的话,就按照 3 楼给出的 debug 方法,设置 data breakpoint, access type 为 wirte。

出0入0汤圆

 楼主| 发表于 2017-2-15 09:26:05 | 显示全部楼层
security 发表于 2017-2-15 08:45
你应该根据前面坛友的建议,去抓下问题。

问题的本质,就是内存被篡改了,看看是否越界,指针指向错误等 ...

按照前边的坛友查过, 我定义的是数组内存空间指点够了 不涉及内容的改写, 另外没有涉及指针,
正在排查别的原因, 实在不行只能用一次读取一次了

出0入0汤圆

 楼主| 发表于 2017-2-15 09:30:35 | 显示全部楼层
sjnh 发表于 2017-2-15 08:46
..\..\User\Ethernet\Internet\tcp_demo.c(1205): warning:  #167-D: argument of type "volatile uint8_t  ...

类型是一样的, 现在的问题是从NANDFLASH里读出的到数组里边的内容 莫名其妙的变了,但是nandflash里边的内容 是没有变的

出0入0汤圆

发表于 2017-2-15 12:45:33 | 显示全部楼层
可能是堆栈溢出了。

出0入0汤圆

 楼主| 发表于 2017-2-15 14:45:42 | 显示全部楼层
本帖最后由 jiangzhimin 于 2017-2-15 15:16 编辑
security 发表于 2017-2-15 08:53
能在线 debug 的话,就按照 3 楼给出的 debug 方法,设置 data breakpoint, access type 为 wirte。 ...


是这个窗口吗,  data breakpoint 还有点不懂   不知哪里出错

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入8汤圆

发表于 2017-2-15 15:25:30 | 显示全部楼层
jiangzhimin 发表于 2017-2-15 14:45
是这个窗口吗,  data breakpoint 还有点不懂   不知哪里出错

是的,
你点击右下角的 help,看看手册。

出0入0汤圆

 楼主| 发表于 2017-2-15 15:45:19 | 显示全部楼层
各位这样设置断点条件对吗。 command 一般后边填什么啊, 网上查了很多资料一般都不填也行吧

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入8汤圆

发表于 2017-2-15 15:55:24 | 显示全部楼层
本帖最后由 security 于 2017-2-15 16:01 编辑
jiangzhimin 发表于 2017-2-15 15:45
各位这样设置断点条件对吗。 command 一般后边填什么啊, 网上查了很多资料一般都不填也行吧 ...


你应该去定义为内存变量,使用 access 选项。

Help 里面没讲吗?不应该啊。
我多年未用 MDK,已经忘了很多,也许我说的是错,总之看 help 吧。

如果 help 看不明白,我找一下资料给你推送一下。

出0入8汤圆

发表于 2017-2-15 15:57:17 | 显示全部楼层
jiangzhimin 发表于 2017-2-15 15:45
各位这样设置断点条件对吗。 command 一般后边填什么啊, 网上查了很多资料一般都不填也行吧 ...

command 填的是,断点触发后,要执行的动作,保持为空即可。

出0入8汤圆

发表于 2017-2-15 16:04:19 | 显示全部楼层
去这边:
ARM开发工具RealView_MDK使用入门—李宁 PDF版
下载这本书,里面 12.2.1 断点对话框,有比较详细点的描述。

出0入0汤圆

 楼主| 发表于 2017-2-15 18:47:30 | 显示全部楼层
设置 data breakpoint,
没有设置成功, 只能找到相关的函数,
各位在主循环中不断的进行读操作 ,理论上是对NANDFLASH 没有伤害的, 只有擦除和写有伤害
还是对不断读取有点担心, 各位用过的大师,这样可以吗

出0入0汤圆

 楼主| 发表于 2017-2-16 09:17:51 | 显示全部楼层
好好看了下NANDFLASH的命令,
FSMC_NAND_ReadSmallPage (RxBuffer, WriteReadAddr, 1);
FSMC_NAND_ReadSpareArea (RxBuffer1, WriteReadAddr, 1);
好像是越界了,

FSMC_NAND_ReadSmallPage (RxBuffer, WriteReadAddr, 1);

解释好像数读整个页地址, 512  

FSMC_NAND_ReadSpareArea (RxBuffer1, WriteReadAddr, 1);
好像解释读固定区域的
现在只能在试一试了

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 23:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表