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)
解决:低级错误,没有设置元件型号!
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)
解决:低级错误,没有设置元件型号!
举报