IAREWARM5.11使用问题请教。区别与IAREWARM4。42
用 5.11 编译IAREWARM 4.42 STM32 库出错。如下:
Error[Li005]: no definition for "__program_start" referenced from D:STM32STM32F10xFWLibFWLib
而且在 LINKER 选项里:
LINKER CONFIGURATION FILE
$TOOLKIT_DIR$CONFIGgeneric.icf
跟4.42的 linarm_flash.xcl 不一样了!
在 STM32F10X_VECTORS.C中 __iar_program_start的实现?
看看这个函数只是个空函数,他如何实现的呢?
void __iar_program_start( void );
#pragma location = ".intvec"
/* STM32F10x Vector Table entries */
const intvec_elem __vector_table[] =
{
{ .__ptr = __sfe( "CSTACK" ) },
__iar_program_start, //------------- 定位到向量处,运行
NMIException,
HardFaultException,
__iar_program_start是一个空指针吗?空函数。
这个在KEIL是这样实现的。
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler
。。。
。。。
; Reset handler routine
Reset_Handler PROC
EXPORT Reset_Handler
IMPORT __main
LDR R0, =__main
BX R0
ENDP
ALIGN
就是说复位入口 ENTRY 是 0X00000, 它直接跳到 MAN()去运行!
看IAR的这个指针函数表中的 __iar_program_start 又是何解?
它如何做到 跳到MAIN()去的呢?
如果要支持IAR 5.11需要做如下改动
1.stm32f10x_vector.c
用__iar_program_start替代__program_start,__iar_program_start是编译后的代码的入口地址,4.42版本的名字是__program_start,5.11版本是__iar_program_start
2.配置一个icf文件
可以参考我的O-Link代码,可以使用IAR EWAEM 5.11编译
这是在main之前执行的由IAR提供的一个初始化程序
这个初始化程序通常会设定一些C程序必须的环境参数,尤其是有初值的全局变量。
例如:
int a = 3;
main()
{
......
......
}
这个(a = 3)的初始化操作就需要那个初始化程序完成。
这种做法确实令人恼火!
在ARM7/9就是这样的了,总把一些东西封装起来。编译器管理了,我们就如傻瓜。
所以我们用ADS,KEIL来开发ARM7/ARM9, 就很明了。使用汇编来写 STARTUP.S启动代码一目了然。中断向量如何映射,堆栈如何初始化,变量如何清零,然后如何跳到MAIN去等等。这也很合符CPU的启动过程。
再问, IAR的堆栈如何初始化,变量如何清零?
也就是如何能修改void __iar_program_start( void );
如何能修改void __iar_program_start( void )?
在IAR的系统目录下有源文件
我用的是IAR 4.42A,其它版本应该差别不大。
在“ProjectOptions...”进入LinkerConfig,通过设置“Override default program entry”选择是否使用默认的初始化启动文件。
IAR 4.42A的默认初始化启动文件的源码是:....IAR SystemsEmbedded Workbench 4.0armsrclibcstartup.s79,你可以把它拷贝到自己的目录下并修改,变成自己的初始化启动文件。
直接这样救恩可以了?
记得GCC需要设置--no-cstartup(好像是这么写的)编译参数,IAR需要设置类似的参数吗?
re
这种做法确实令人恼火!
在ARM7/9就是这样的了,总把一些东西封装起来。编译器管理了,我们就如傻瓜。
所以我们用ADS,KEIL来开发ARM7/ARM9, 就很明了。使用汇编来写 STARTUP.S启动代码一目了然。中断向量如何映射,堆栈如何初始化,变量如何清零,然后如何跳到MAIN去等等。这也很合符CPU的启动过程。
再问, IAR的堆栈如何初始化,变量如何清零?
-----------------------------------------------------------
启动代码里调用了_segment_init的库函数.可以在IAR的目录下找到这个函数的.c和.h文件...这个函数把段进行了拷贝...
感觉这些问题不不是一定需要刻意的去了解的
如果有特殊的需要,去了解一下启动代码还是很简单的,模拟调试一下就可以了
确实很多编译器会把某些东西封装起来再(很少见编译器需要自己写C的启动代码的吧),我觉得只要能在文档或者说明中指出如果有特殊需要如何去修改就已经很不错了
iar一般在__low_level_init()里干坏事~~~
还是继续请教 各位大虾。
4。42 的 RAM.XCL里:
#pragma segment="DATA_ID"
#pragma segment="DATA_I"
#pragma segment="DATA_Z"
而5.11 的配置ICF里。没有了以上的段定义了!
5。11的ICF里只有 栈和堆 之分!!
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
那么全局变量呢? 哪去了?
初始化为零的全局变量呢?
re
没用过5.11..
听说4.22用SAM7挺熟悉的...怎么好象以前听说5.11不支持CORTEXM3么??
难道两者区别很大??谁能说说
修改很简单
1.把vector.c 中的__programe_start改成__iar_programe_start。
2.把vector.c 中的"INTVEC"改成".intevc"。
3.点击linker->configer->override default下的Edit,写入相应地址,编写icf文件。