单片机学习小组
直播中

符筹荣

7年用户 972经验值
私信 关注

IAR C编译器中如何选择才能不初始化片内RAM


IAR C编译器中如何选择才能不初始化片内RAM?
配置IAR时器件与代码选型不一致怎么办呢?

回帖(1)

汪海源

2022-1-27 10:50:17
1、2012.4.12: IAR C编译器中如何选择才能不初始化片内RAM
                  程序复位不清除变量值
   用__no_init 实现:__no_init 是一个SEGMENT,是给LINKER用的,定义到不初始化的块中去。
    __no_init用于禁止系统启动时的变量初始化,什么情况下需要用这个关键字使系统禁止变量的初始化,禁止变量初始化用在什么场合,为什么要这样做,有什么意义吗?
   1、看门狗复位的现场恢复,如果初始化了就完全不可恢复了
   2、使用nvram保存数据,需要连续记录的。
   
给一简单的程序,例如你做一个时钟,不希望在狗复位时丢失时间,可如此定义
__no_init unsigned char month,day,hour,minute,second;
     配置IAR时遇到的一些问题

问题一:器件与代码选型不一致
1.Options设置


编译结果:


2.Options设置


编译结果:


               查找相关文件即可。
3.Options设置
       更换Device;
知识点:
Big endian machine: It thinksthe first byte it reads is the biggest.
Little endian machine: It thinks the first byte itreads is the littlest.
举个例子,从内存地址0x0000开始有以下数据
0x0000     0x12
0x0001     0x34
0x0002     0xab
0x0003     0xcd
如果我们去读取一个地址为0x0000的四个字节变量,若字节序为big-endian,则读出
结果为0x1234abcd;若字节序位little-endian,则读出结果为0xcdab3412.
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
                big-endian     little-endian
0x0000     0x12              0xcd
0x0001     0x23              0xab
0x0002     0xab              0x34
0x0003     0xcd              0x12
x86系列CPU都是little-endian的字节序.
问题二:库文件路径设置
1.    配置1:


文件实际路径:


2.    配置2:


文件实际路径:


配置说明:
1)$TOOLKIT_DIR$INC:表示开发工具系统目录,即:C:Program FilesIAR SystemsEmbedded Workbench 4.0 Kickstartarm;
2)$PROJ_DIR$:表示用户程序系统目录,即*.ewp文件所在目录;
3)配置1中,*.ewp路径为:D:PLAYPractise_STM32Project,作为“$PROJ_DIR$”的值;
              *.lib路劲为:D:PLAYPractise_STM32libraryinc, 作为“$PROJ_DIR$.. libraryinc”的值;其中“..”表示:往上一目录退一层;
配置2中,*.ewp路径为:D:PLAYUSARTExample1,作为“$PROJ_DIR$”的值;
*.lib路劲为:D:PLAYUSARTExample1libraryinc,作为“$PROJ_DIR$libraryinc”的值,同层;
问题三:编译错误
提示:Fatal Error[e72]:Segment IRQ_STACK must be defined in a segment definition option (-Z, -b or -P)
解决:低级错误,没有设置元件型号!


举报

更多回帖

发帖
×
20
完善资料,
赚取积分