本帖最后由 df_flying 于 2019-3-12 10:41 编辑
三、FreeRTOS移植: 官方的BSP包里已经包含了FreeRTOS的例程,这里简单的将其移植到LEDdemo的程序里,方便后期独立使用。 首先将BSP安装包的rtos里的freertos文件夹复制到LEDdemo程序中,这里先添加了Middleware文件夹用于放第三方固件以及驱动中间件,具体放哪,看个人喜好。其次将在工程里添加相应的.c 及 .h文件,并且添加相应的路径,这里需要注意的是keil应选择RVDS文件夹里的相应poart文件,官方同时将systick一同给了相应的文件fsl_tickss_systick.c,一同加入工程。加入好的工程及路径如下:
这里还缺少一个FreeRTOS的config文件,直接复制 SDK_2.3.0_EVK-MIMXRT1050\boards\evkmimxrt1050\rtos_examples\freertos_hello里面的FreeRTOSConfig.h作为基础,修改即可,最后还差个宏定义FSL_RTOS_FREE_RTOS,放到Options的C/C++下Define里。简单修改下这个宏定义,将任务调度频率提高到1K: #define configTICK_RATE_HZ ((TickType_t)1000) 编译发现如下ERR:“This portcan only be used when the project options are configured to enable hardwarefloating point support”这里需要更改下对硬件浮点的支持。 这里使用了个简单的任务,代码如下: static void led_task(void *pvParameters) { (void) pvParameters; TickType_t xTime = xTaskGetTickCount(); for (;;) { RGB_GREEN_LED_TOGGLE;
vTaskDelayUntil(&xTime,portTICK_PERIOD_MS * 1000); PRINTF("LED!systemTicks is %d\r\n",xTaskGetTickCount()); }
} 执行后发现有点奇怪,时钟跟实际的时间有区别。 分析是时钟基数不对导致的问题,分析了下时钟的初始化函数,发现野火LEDdemo 程序中对SystemCoreClock 全局变量直接在BOARD_BootClockRUN()函数中使用了下面的宏定义: SystemCoreClock =BOARD_BOOTCLOCKRUN_CORE_CLOCK;
#define BOARD_BOOTCLOCKRUN_CORE_CLOCK 600000000U /*!< Core clock frequency: 600000000Hz */ 但是系统实际配置的是528MHz,所以这里需要改成528000000U,官方代码调用了SystemCoreClockUpdate()函数重新读取了实际配置值,这里也可以使用读取值更新。
SystemCoreClock = (freq / (((CCM->CBCDR& CCM_CBCDR_AHB_PODF_MASK) >> CCM_CBCDR_AHB_PODF_SHIFT) + 1U)); 修正后如测试下: 测试代码见附件。
|