黄瓜 发表于 2014-3-21 15:32:35

keil c51 中使用 const 和 code 的一点想法

声明:以下想法纯属个人乱想,欢迎大家丢鸡蛋并说出自己的理解 {:smile:}

    unsigned char code * Point = 0x0F00;

    unsigned char const * constPoint = 0x0F00;

变量/常亮的定义如上,首先说明下我遇到的问题:
在数据初始化的时候向 eeprom地址 0xE0 中写入数据 0x0F,在 0xE1中写入 0x72,在读数据函数中是直接使用的数据手册推荐的   *(Point + offset)的方法去除数据的
在使用上面两个不同的定义读 eeprom时得到两个不同的数据,数据发送是低位在前,先发的 0x0F,再发的 0x72,反过来以后 应该是 1111 0000   0100 1110
宽脉冲为 1,窄脉冲为 0
这个是使用 unsigned char const * const Point = 0x0F00; 定义得到的数据



这个是使用 unsigned char code * Point = 0x0F00;得到的数据


可以明显区别两个数据的不同,且后者才是正确的数据。

不知是什么问题导致理论上的相同位置出现两组不同的数据。故大胆猜测,这两个地址指向的不是同一个位置,也就是说两种方式的定义使得 0x0F00被定义的位置发生了变化

一个是相对代码段偏移 0x0F00而 eeprom在代码段的后段所以指向的位置是正确的{:mad:} ,一个是相对起始地址 0x0000偏移 0x0F00 // 这个应该是对的
这也说不通啊{:dizzy:} ,具体情况我也不知道,向各位请教下{:smile:}

为什么就改变了下数据定义的方式,出来的结果完全不一样呢{:mad:}

mcu5i51 发表于 2014-3-21 16:45:30

const 指向的是RAM的地址
code 指向的FLASH的地址
编译后看RAM变化可以知道

mcu5i51 发表于 2014-3-21 16:47:29

你的const 应该是外部RAM数据,或P0口的状态

了无 发表于 2014-3-21 17:30:03

学习了,楼上说的应该是正确的

richards 发表于 2014-3-21 19:19:25

这个算是明白了。

奮闘ing 发表于 2014-3-22 10:13:56

学习了~

four_zhg 发表于 2014-3-22 11:15:37

学习一下了
页: [1]
查看完整版本: keil c51 中使用 const 和 code 的一点想法