- 主题:volatile问题请教
最近在看一段嵌入式的代码,有些不懂,请大家帮忙:
一直发帖失败,贴图
--
FROM 101.93.241.*
数组下标。改写成下面这种就明白了
从内存地址0x40000000开始,视为一个unsigned int数组。
unsigned int RESET_INT(void)
{
volatile unsigned int * p = (volatile unsigned int *)0x40000000;
return p[0x1000 /4 ] & 0x400;
}
--
FROM 114.241.227.*
谢谢!
我从你的code中理解的是,先返回地址为0x40000400的值,这个值是unsigned int(32 bit), 然后再与上第10位,就是最终真正返回的值?
这种取值方式有办法保证不越界么,我记得数组指针都会预先定义大小的啊,但是在当前codw中没有看到啊
【 在 z16166 的大作中提到: 】:
数组下标。改写成下面这种就明白了
从内存地址0x40000000开始,视为一个unsigned int数组。
unsig
--
FROM 101.93.241.*
理解得不对。
如果这个嵌入式平台 sizeof(unsigned int) == 4的话,
是将地址0x40001000 ~ 0x40001003处的这4个字节作为unsigned int取出来,然后与0x400进行bit AND。
这个平台从0x40000000处开始估计是映射的一段特殊的数据,至于是什么数据,得查硬件手册。
C里面指针和数组可以等价使用,唯一的区别是数组指定了元素个数。
这段内存是特殊数据,只要按照硬件手册来访问、不越界就行。
【 在 chglele 的大作中提到: 】
: 谢谢!
: 我从你的code中理解的是,先返回地址为0x40000400的值,这个值是unsigned int(32 bit), 然后再与上第10位,就是最终真正返回的值?
: 这种取值方式有办法保证不越界么,我记得数组指针都会预先定义大小的啊,但是在当前codw中没有看到啊
: ...................
--
修改:z16166 FROM 114.241.227.*
FROM 114.241.227.*
[0x1000/4],代表什么?
不是0x40000400 - 0x40000403?是我对中括号的内容理解错了?
【 在 z16166 的大作中提到: 】:
理解得不对。
如果这个嵌入式平台 sizeof(unsigned int) == 4的话,
是将地址0x40001000
--
FROM 101.93.241.*
中括号里面是数组元素的下标(0x1000 /4),
但是这个数组的每个元素是unsigned int,占4字节。
这样下标为0x400的元素的地址就是:0x40000000 + (0x1000 /4) * sizeof(unsigned int)
【 在 chglele 的大作中提到: 】
: [0x1000/4],代表什么?
: 不是0x40000400 - 0x40000403?是我对中括号的内容理解错了?
:
: ...................
--
修改:z16166 FROM 114.241.227.*
FROM 114.241.227.*
看不到你之前回复的帖子了,但我理解了。
unsigned int型数组,每个值占4byte, 所以他写的[0x1000/4]就是代表偏移地址0x1000-0x1003
对么?
再次感谢
【 在 chglele 的大作中提到: 】:
[0x1000/4],代表什么?
不是0x40000400 - 0x40000403?是我对中括号的内容理解错了?
--
FROM 101.93.241.*
对。
为啥看不到?是因为有图片就退出登录了?time to sleep.
--
修改:z16166 FROM 114.241.227.*
FROM 114.241.227.*
顶
【 在 z16166 的大作中提到: 】
: 数组下标。改写成下面这种就明白了
: 从内存地址0x40000000开始,视为一个unsigned int数组。
: unsigned int RESET_INT(void)
: ...................
--
FROM 59.44.240.*