FRDM-KE02终于到了呢,马上试了几个测试程序,平台Keil,本想写几个Dhrystone测试,结果发现使用官方库kexx_drv_lib的时候,只能在使用了Microlib的时候正常运行,使用Microlib还怎么进行Dhrystone测试啊
100_9450.JPG (90.96 KB, 下载次数: 0)
下载附件
2014-9-12 22:05 上传
查了原因啊查原因,我发现了个我不能理解的地方就是vectors.c这个文件!!!
FSL的工程师们是怎么想的,弄出个这么鸡肋的东西来,至少是在Keil平台上是一个鸡肋
且听我娓娓道来,我是如何不能忍受的
这是vectors.c的部分程序
- #ifdef KEIL
- const vector_entry __vector_table[] __attribute__((at(0x00))) =
- #elif (defined(__GNUC__))
- //void (* const __vector_table[])() __attribute__ ((section(".vectortable"))) =
- void (* const InterruptVector[])() __attribute__ ((section(".vectortable"))) =
- #else
- #pragma location = ".intvec"
- const vector_entry __vector_table[] = //@ ".intvec" =
- #endif
- {
- VECTOR_000, /* Initial SP */
- VECTOR_001, /* Initial PC */
- VECTOR_002,
- VECTOR_003,
- VECTOR_004,
- VECTOR_005,
- VECTOR_006,
- VECTOR_007,
- VECTOR_008,
- VECTOR_009,
- VECTOR_010,
- VECTOR_011,
- VECTOR_012,
- VECTOR_013,
- VECTOR_014,
- VECTOR_015,
- VECTOR_016,
- VECTOR_017,
- VECTOR_018,
- VECTOR_019,
- VECTOR_020,
- VECTOR_021,
- VECTOR_022,
- VECTOR_023,
- VECTOR_024,
- VECTOR_025,
- VECTOR_026,
- VECTOR_027,
- VECTOR_028,
- VECTOR_029,
- VECTOR_030,
- VECTOR_031,
- VECTOR_032,
- VECTOR_033,
- VECTOR_034,
- VECTOR_035,
- VECTOR_036,
- VECTOR_037,
- VECTOR_038,
- VECTOR_039,
- VECTOR_040,
- VECTOR_041,
- VECTOR_042,
- VECTOR_043,
- VECTOR_044,
- VECTOR_045,
- VECTOR_046,
- VECTOR_047 // END of real vector table
- };
- // VECTOR_TABLE end
- #ifndef KEIL
- #ifndef USE_BOOTLOADER
- #ifdef KEIL
- const uint32_t __flash_config[] __attribute__((at(0x400))) =
- #elif (defined(__GNUC__))
- const uint32_t __flash_config[] __attribute__ ((section(".cfmconfig"))) =
- #else
- #pragma location = 0x400
- __root const uint32_t __flash_config[] = //@ ".intvec" =
- #endif
- {
- CONFIG_1,
- CONFIG_2,
- CONFIG_3,
- CONFIG_4,
- };
- #endif
- #endif
复制代码
我们可以看到,在0x0000位置强制放置了__vector_table[]数组
在0x0400位置本也打算强制放置__flash_config[]来着,可是如下的宏命令
- #ifndef KEIL
- #ifndef USE_BOOTLOADER
- #ifdef KEIL
复制代码
可知,这段话在KEIL下无效
接上次我分析的启动文件,startup_MKE02Z2.s,在里面也定义了
- ; Vector Table Mapped to Address 0 at Reset
- AREA RESET, DATA, READONLY
- EXPORT __Vectors
- EXPORT __Vectors_End
- EXPORT __Vectors_Size
- __Vectors DCD __initial_sp ; Top of Stack
- DCD Reset_Handler ; Reset Handler
- DCD NMI_Handler ; NMI Handler
- DCD 0 ; Reserved
- DCD 0 ; Reserved
复制代码
难道__vector_table和__Vectors不冲突吗??
使用microlib时,我把vectors.c删掉,编译看map文件,部分如下
- __Vectors 0x00000000 Data 4 startup_mke02z2.o(RESET)
- __Vectors_End 0x000000c0 Data 0 startup_mke02z2.o(RESET)
- __Vectors_Size 0x000000c0 Number 0 startup_mke02z2.o ABSOLUTE
- __main 0x000000c1 Thumb Code 0 entry.o(.ARM.Collect$$00000000)
- _main_stk 0x000000c1 Thumb Code 0 entry2.o(.ARM.Collect$$00000001)
- _main_scatterload 0x000000c5 Thumb Code 0 entry5.o(.ARM.Collect$$00000004)
复制代码
可以发现,.s里的__Vectors放置在了期望的0x0000地址
但是按官方Demo,同时编译链接vectors.c的时候,map部分为
- __Vectors 0x000000c0 Data 4 startup_mke02z2.o(RESET)
- __Vectors_Size 0x000000c0 Number 0 startup_mke02z2.o ABSOLUTE
- __Vectors_End 0x00000180 Data 0 startup_mke02z2.o(RESET)
- __main 0x00000181 Thumb Code 0 entry.o(.ARM.Collect$$00000000)
- _main_stk 0x00000181 Thumb Code 0 entry2.o(.ARM.Collect$$00000001)
- _main_scatterload 0x00000185 Thumb Code 0 entry5.o(.ARM.Collect$$00000004)
复制代码- __vector_table 0x00000000 Data 192 vectors.o(.ARM.__AT_0x00000000)
- _printf_a 0x00000000 Number 0 stubs.o ABSOLUTE
复制代码
居然把中断向量表放在了Flash中两次!!
也罢,库的版本还是
- ***************************************************************************//*!
- *
- * @file vectors.c
- *
- * @author Freescale
- *
- * @version 0.0.1
- *
- * @date Jun. 25, 2013
- *
- * @brief provide interrupt vector table for Kinetis E.
- *
- *******************************************************************************/
复制代码
FSL这样做是为了平台间的兼容?
我们再看isr.h,里面的部分内容是这样子的
- #undef VECTOR_036
- #define VECTOR_036 RTC_Isr /*!< Vector 36 points to RTC interrupt service routine */
- extern void RTC_Isr(void);
复制代码
也就是将vectors.c里的第36号中断向量给赋值成函数RTC_Isr的地址
因为需要手动的更改.h文件里的中断向量号和函数的对应地址,这不见得比直接调用.s里的RTC_IRQHandler方便
但是,因为vectors.c的存在,.s里的RTC_IRQHandler现在已经在一个莫名其妙的地方,不起作用了
另一个,vectors.h里有这么一句
- #elif (defined(KEIL))
- #define VECTOR_000 (pointer*)__initial_sp // ARM core Initial Supervisor SP
- #define VECTOR_001 Reset_Handler // 0x0000_0004 1 - ARM core Initial Program Counter
- #else
复制代码
使用了startup_MKE02Z2.s里的堆栈起始地址,但是startup_MKE02Z2.s里的
- IF :DEF:__MICROLIB
- EXPORT __initial_sp
- EXPORT __heap_base
- EXPORT __heap_limit
- ELSE
复制代码
只有当使用了MICROLIB才被Export好不。。
可能是用ST的库用惯了,总结FSL的这个库是一个很欠完善的库,另外许多外设的函数也找不到,希望官方能够尽早推出理想的版本
一周热门 更多>