(一)Freertos
Freertos是目前使用最广泛的免费开源实时操作系统,但是之所以选择它而非其他比如RTT这种强大的货色或者μC/OS-II这类最广为使用的货色,主要原因还是因为mcuxpresso带着个包!
Freertos在V10版本之后前面就带了个帽子,Amazo Freertos,我一开始以为是贝佐斯跟NXP有什么PY,为啥要NXP在Freertos加上Amazo的IOT组件,后来偶然发现……世界首富把Freertos买了……果然土豪解决问题的方法就是不一样。
开发环境准备,库软件包下载地址:
http://mcuxpresso.nxp.com/en/welcome
记得勾上带了Amazo 的 Freertos,,着个Amazo Freertos版本是10.0.1
(二)移植
开发环境:MCUXpresso IDE V11.1.0
软件包:2.7.0
开发板:官方LPC54628开发板
移植只需要修改下FreertosConfig.h,直接生成的配置工程也可以直接用,但有个小地方需要修改下,见(四)
此外还需要在时钟里面配置下systick的时钟使能
(三)实验
只需要启动下调度器就行了。
下面我用freertos的软件时钟做个小demo:
- SystemCoreClockUpdate();
- TimerHandle_t SwTimerHandle = NULL;
- SwTimerHandle = xTimerCreate("SwTimer", /* Text name. */
- SW_TIMER_PERIOD_MS, /* Timer period. */
- pdTRUE, /* Enable auto reload. */
- 0, /* ID is not used. */
- SwTimerCallback); /* The callback function. */
- xTimerStart(SwTimerHandle, 0);
- vTaskStartScheduler();
复制代码 声明下:
- #define SW_TIMER_PERIOD_MS (1000 / portTICK_PERIOD_MS)
- static void SwTimerCallback(TimerHandle_t xTimer);
复制代码
为了看先效果,我让灯闪烁起来,初始化添加:
- BOARD_InitLEDsPins();
- LED1_INIT(0);
复制代码
软件定时器回调函数:
- static void SwTimerCallback(TimerHandle_t xTimer)
- {
- LED1_TOGGLE();
- }
复制代码
(四)排错
初始化时在port.c的341行卡住了:
- #ifdef configPRIO_BITS
- {
- /* Check the FreeRTOS configuration that defines the number of
- priority bits matches the number of priority bits actually queried
- from the hardware. */
- configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );
- }
- #endif
复制代码
这个宏定义 configASSERT 转化后如下:
- if((( ( ( uint8_t ) 7 ) - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS) == 0) {vPortRaiseBASEPRI(); for (;;);}
复制代码
即优先级相关配置不符合要求则死在该循环内。
但是DEBUG后,读到ulMaxPRIGROUPValue的值为4,__NVIC_PRIO_BITS也是3,我甚至还把Freertos_config里面的
- #ifdef __NVIC_PRIO_BITS
- /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
- #define configPRIO_BITS __NVIC_PRIO_BITS
- #else
- #define configPRIO_BITS 4 /* 15 priority levels */
- #endif
复制代码
修改为:
- #ifdef __NVIC_PRIO_BITS
- /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
- #define configPRIO_BITS 3
- #else
- #define configPRIO_BITS 4 /* 15 priority levels */
- #endif
复制代码
可以看到我IDE里面高亮的部分:
__NVIC_PRIO_BITS 直接定义为3,判断结果理应为true,但无论如何仿真都死在这个函数内。
我不信邪于是跑了波模版工程,,模板工程就是直接把__NVIC_PRIO_BITS 直接定义为3,DEBUG事后,读到 ulMaxPRIGROUPValue 的值也为4,但竟然离奇地跑过去了!
这个问题困扰了我很久,最后才发现,IDE高亮把我坑了!,实际上头文件要包含了lpc54628.h才会有定义__NVIC_PRIO_BITS,真正有效的是下面那个,只需要把下面的4改为3,就能跑过去,灯亮起来啦!
|