吐槽飞思卡尔KE库kexx_drv_lib

2020-02-20 19:55发布

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的部分程序
  1. #ifdef KEIL
  2. const vector_entry  __vector_table[] __attribute__((at(0x00))) =
  3. #elif (defined(__GNUC__))
  4. //void (* const __vector_table[])() __attribute__ ((section(".vectortable"))) =
  5. void (* const InterruptVector[])() __attribute__ ((section(".vectortable"))) =
  6. #else
  7. #pragma location = ".intvec"
  8. const vector_entry  __vector_table[] = //@ ".intvec" =
  9. #endif
  10. {
  11.    VECTOR_000,           /* Initial SP           */
  12.    VECTOR_001,           /* Initial PC           */
  13.    VECTOR_002,
  14.    VECTOR_003,
  15.    VECTOR_004,
  16.    VECTOR_005,
  17.    VECTOR_006,
  18.    VECTOR_007,
  19.    VECTOR_008,
  20.    VECTOR_009,
  21.    VECTOR_010,
  22.    VECTOR_011,
  23.    VECTOR_012,
  24.    VECTOR_013,
  25.    VECTOR_014,
  26.    VECTOR_015,
  27.    VECTOR_016,
  28.    VECTOR_017,
  29.    VECTOR_018,
  30.    VECTOR_019,
  31.    VECTOR_020,
  32.    VECTOR_021,
  33.    VECTOR_022,
  34.    VECTOR_023,
  35.    VECTOR_024,
  36.    VECTOR_025,
  37.    VECTOR_026,
  38.    VECTOR_027,
  39.    VECTOR_028,
  40.    VECTOR_029,
  41.    VECTOR_030,
  42.    VECTOR_031,
  43.    VECTOR_032,
  44.    VECTOR_033,
  45.    VECTOR_034,
  46.    VECTOR_035,
  47.    VECTOR_036,
  48.    VECTOR_037,
  49.    VECTOR_038,
  50.    VECTOR_039,
  51.    VECTOR_040,
  52.    VECTOR_041,
  53.    VECTOR_042,
  54.    VECTOR_043,
  55.    VECTOR_044,
  56.    VECTOR_045,
  57.    VECTOR_046,
  58.    VECTOR_047          // END of real vector table
  59. };
  60. // VECTOR_TABLE end
  61. #ifndef KEIL
  62. #ifndef USE_BOOTLOADER
  63. #ifdef KEIL
  64. const uint32_t  __flash_config[] __attribute__((at(0x400))) =
  65. #elif (defined(__GNUC__))
  66. const uint32_t __flash_config[] __attribute__ ((section(".cfmconfig"))) =
  67. #else
  68. #pragma location = 0x400
  69. __root const uint32_t  __flash_config[] = //@ ".intvec" =
  70. #endif
  71. {
  72.    CONFIG_1,
  73.    CONFIG_2,
  74.    CONFIG_3,
  75.    CONFIG_4,
  76. };       
  77. #endif
  78. #endif
复制代码
我们可以看到,在0x0000位置强制放置了__vector_table[]数组
在0x0400位置本也打算强制放置__flash_config[]来着,可是如下的宏命令
  1. #ifndef KEIL
  2. #ifndef USE_BOOTLOADER
  3. #ifdef KEIL
复制代码
可知,这段话在KEIL下无效

接上次我分析的启动文件,startup_MKE02Z2.s,在里面也定义了
  1. ; Vector Table Mapped to Address 0 at Reset

  2.                 AREA    RESET, DATA, READONLY
  3.                 EXPORT  __Vectors
  4.                 EXPORT  __Vectors_End
  5.                 EXPORT  __Vectors_Size

  6. __Vectors       DCD     __initial_sp  ; Top of Stack
  7.                 DCD     Reset_Handler  ; Reset Handler
  8.                 DCD     NMI_Handler  ; NMI Handler
  9.                 DCD     0  ; Reserved
  10.                 DCD     0  ; Reserved
复制代码

难道__vector_table和__Vectors不冲突吗??
使用microlib时,我把vectors.c删掉,编译看map文件,部分如下
  1.     __Vectors                                0x00000000   Data           4  startup_mke02z2.o(RESET)
  2.     __Vectors_End                            0x000000c0   Data           0  startup_mke02z2.o(RESET)
  3.     __Vectors_Size                           0x000000c0   Number         0  startup_mke02z2.o ABSOLUTE
  4.     __main                                   0x000000c1   Thumb Code     0  entry.o(.ARM.Collect$$00000000)
  5.     _main_stk                                0x000000c1   Thumb Code     0  entry2.o(.ARM.Collect$$00000001)
  6.     _main_scatterload                        0x000000c5   Thumb Code     0  entry5.o(.ARM.Collect$$00000004)
复制代码
可以发现,.s里的__Vectors放置在了期望的0x0000地址

但是按官方Demo,同时编译链接vectors.c的时候,map部分为
  1.     __Vectors                                0x000000c0   Data           4  startup_mke02z2.o(RESET)
  2.     __Vectors_Size                           0x000000c0   Number         0  startup_mke02z2.o ABSOLUTE
  3.     __Vectors_End                            0x00000180   Data           0  startup_mke02z2.o(RESET)
  4.     __main                                   0x00000181   Thumb Code     0  entry.o(.ARM.Collect$$00000000)
  5.     _main_stk                                0x00000181   Thumb Code     0  entry2.o(.ARM.Collect$$00000001)
  6.     _main_scatterload                        0x00000185   Thumb Code     0  entry5.o(.ARM.Collect$$00000004)
复制代码
  1.     __vector_table                           0x00000000   Data         192  vectors.o(.ARM.__AT_0x00000000)
  2.     _printf_a                                0x00000000   Number         0  stubs.o ABSOLUTE
复制代码

居然把中断向量表放在了Flash中两次!!
也罢,库的版本还是
  1. ***************************************************************************//*!
  2. *
  3. * @file vectors.c
  4. *
  5. * @author Freescale
  6. *
  7. * @version 0.0.1
  8. *
  9. * @date Jun. 25, 2013
  10. *
  11. * @brief provide interrupt vector table for Kinetis E.
  12. *
  13. *******************************************************************************/
复制代码

FSL这样做是为了平台间的兼容?
我们再看isr.h,里面的部分内容是这样子的
  1. #undef  VECTOR_036
  2. #define VECTOR_036      RTC_Isr          /*!< Vector 36 points to RTC interrupt service routine */

  3. extern void RTC_Isr(void);
复制代码

也就是将vectors.c里的第36号中断向量给赋值成函数RTC_Isr的地址
因为需要手动的更改.h文件里的中断向量号和函数的对应地址,这不见得比直接调用.s里的RTC_IRQHandler方便
但是,因为vectors.c的存在,.s里的RTC_IRQHandler现在已经在一个莫名其妙的地方,不起作用了

另一个,vectors.h里有这么一句
  1. #elif (defined(KEIL))
  2. #define VECTOR_000      (pointer*)__initial_sp        //          ARM core        Initial Supervisor SP
  3. #define VECTOR_001      Reset_Handler                                                // 0x0000_0004 1 -          ARM core        Initial Program Counter
  4. #else
复制代码
使用了startup_MKE02Z2.s里的堆栈起始地址,但是startup_MKE02Z2.s里的
  1.                 IF      :DEF:__MICROLIB

  2.                 EXPORT  __initial_sp
  3.                 EXPORT  __heap_base
  4.                 EXPORT  __heap_limit

  5.                 ELSE
复制代码
只有当使用了MICROLIB才被Export好不。。

可能是用ST的库用惯了,总结FSL的这个库是一个很欠完善的库,另外许多外设的函数也找不到,希望官方能够尽早推出理想的版本


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。