|
| 采购元器件好去处--维库电子市场网推荐 |
| 技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
怎样用C语言在单片机的ROM里开辟一固定的区域? |
| 来源:21ic 作者:qqkevin 栏目:单片机 |
| 怎样用C语言在单片机的ROM里开辟一固定的区域? 请问怎样用C语言在单片机的ROM里开辟一固定的区域给一个大数组啊? 比如在32K的51单片机里开辟后30K给一个大数组?把一个变量或者数组的地址固定起来?我用了_at_,可是编译器说有错,急死我啦。最好能给下例子,指点下迷津啊,谢过先,谢过先! |
| 1楼: | >>参与讨论 |
| 作者: qqkevin 于 2005-11-4 14:23:00 发布:
改正一下 说错了,改正一下,32K的不是ROM,而是FLASH,我的思路是想把32K或64K的FLASH当EEPROM用,省下外围的EEPROM。单片机用的是SST的89E554RC。请高手指教啊! |
|
| 2楼: | >>参与讨论 |
| 作者: fsaok 于 2005-11-4 14:41:00 发布:
. 在链接程序中设置 |
|
| 3楼: | >>参与讨论 |
| 作者: bbstom 于 2005-11-4 14:44:00 发布:
可能不行。 SST的MCU有两块 FLASH 且可在系统编程,相似叫 IAP 功能。 编译的 _at_ 只可产生 定位地址和存取指令,CODE只能取指令,而且存取指令 跟烧写 FLASH操作是两回事。要不然大家都可以轻松制造 CIH病毒了。 要用 IAP功能,SST的手册上有例子。 |
|
| 4楼: | >>参与讨论 |
| 作者: qqkevin 于 2005-11-4 14:57:00 发布:
谢谢 谢谢楼上的高手,请问可以给个地址我看看SST的手册吗?我想知道那手册是怎么写的?Keil支不支持? |
|
| 5楼: | >>参与讨论 |
| 作者: bbstom 于 2005-11-4 16:01:00 发布:
GOOGLE一下: S72048[1].pdf 文件名:S72048[1].pdf |
|
| 6楼: | >>参与讨论 |
| 作者: qqkevin 于 2005-11-4 16:49:00 发布:
发现另一个问题了? 谢谢高手指教!我看了下,这个PDF介绍的是从BLOCK0写入到BLOCK1的.假如我要往里面写入30K的数据,使用IAP的话是不是先把这30K的数据先下载到BLOCK0里,然后再搬到BLOCK1去呢?还是直接下载到BLOCK1去,不经过BLOCK0? 还有.经过测试,SST自带的仿真功能太慢了,我试过11.0592跟22.1还有40M的晶振,晶振速度提高了,仿真速度改观不大,反而跟PC机通信不稳定了.如果是这样的话,我想请教一下,市面上有哪种仿真器对SST的这种支持IAP功能的单片机支持得比较好的,而又不占任何资源.我见过菊阳的仿真器,好用么?如果您熟悉的话也请给我推荐一个吧.谢谢!非常谢谢!获益匪浅啊!! |
|
| 7楼: | >>参与讨论 |
| 作者: fsaok 于 2005-11-4 17:46:00 发布:
把事情想象得太复杂 如果是写入IC,当然可以用 IAP 和编程器两种方式, 如果是用编程器,有指定 Block 的编程, 如果是用 IAP 有很多办法写入,比如是使用 串行口输入数据,写个子程序,接收一个送一个,等等。方法之多,不一一举例了。 |
|
| 8楼: | >>参与讨论 |
| 作者: cxd731 于 2005-11-4 18:02:00 发布:
楼主是第一次用SST的单片机吧 SST那个IAP模式很简单的,不要想的太复杂 这么说吧,BLOCK1的程序是单片机出厂就固化好的,一般情况下我们是把自己写的程序烧录到BLOCK0里面,这个时候当你使用IAP模式时,你那30K数据会自动写到BLOCK1里,但你要注意两个问题:1、你写入的地址必须确保与原先已经有的出厂固化数据不冲突,比如说原先里面数据是到0x0200,那么你那30K数据就从0x0201开始写~,不然的话会把原先单片机自己的数据覆盖掉,那后果不堪设想;2、你写30K数据之前要确保那个区域是事先擦除过的,也就是里面的值全部是0xFF,SST89E554有专门的扇区擦除命令(sector erase);先执行 sector erase,再program。 以上是针对写数据而言,读取数据跟一般EEPROM一样,直接读你原先存放的地址就OK 最后祝你成功:) * - 本贴最后修改时间:2005-11-4 18:05:17 修改者:cxd731 |
|
| 9楼: | >>参与讨论 |
| 作者: qqkevin 于 2005-11-21 10:02:00 发布:
谢谢高手指点 再请教个问题 我在MAIN函数里插入一句:unsigned CHAR code tab[20] _at_ 0x2f00; 想在该地址的程序空间里插入一个数组,但为什么编译器不给通过,显示"absolute specifier illegal"呢?我把这语句换成全局变量来声明,编译给通过,但是调用该数组的时候,KEIL还是显示"absolute specifier illegal"...... 请问究竟是怎么回事啊? |
|
| 10楼: | >>参与讨论 |
| 作者: cxd731 于 2005-11-21 13:42:00 发布:
………… 因为在函数里面定义数组或变量时,运行该变量的是RAM(函数不运行时不给它分配存储空间),而非ROM,而code是针对ROM的,所以编译器会报错…… |
|
| 11楼: | >>参与讨论 |
| 作者: qqkevin 于 2005-11-21 14:29:00 发布:
明白了`` 谢谢大俠指点,那样的话只要把code变量定义移出函数外就可以了。 还有个程序空间绝对定位又赋值的问题,除了在函数前用_at_,然后查看M51文件再在BL51 loction选项那里手工添加代码的形式外,还可以用什么办法啊? |
|
| 12楼: | >>参与讨论 |
| 作者: qqkevin 于 2005-11-25 11:10:00 发布:
在CODE区开辟一程序运行过程可修改的数组? 对于该SST的单片机的话,CODE区对应的程序存储器是该片来的EEPROM. 如果我们在函数外定义了该数组,在函数里面修改它,这样合不合法呢?我想开辟一数组,然后断电的时候又能保持里面的数据. 一般单片机的话定义了是CODE变量的话,就变成只读不能改写了.因为CODE区对应的是ROM. 这里只是想探讨一下针对带EEPROM的单片机,定义为CODE型变量在函数里能否修改其变量值的问题.硬件上CODE区是映射到EEPROM区的,就怕软件不给这样用. 当然如果想那样做的话,还可以调用该单片机的IAP功能. 大家一起探讨探讨啊``` |
|
|
|
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |