|
一、问题描述
在一个使用FreeRTOS的工程中,只做了SD卡的驱动,由于RTOS使用了Systick,故非系统延时函数使用的是 DWT中的时钟周期(CYCCNT)计数功能,但是在SD卡驱动中使用了这个非系统延时导致,烧写程序后板子工作正常,而下电再上电后板子无反应,分析排查去掉了这个非系统延时后工作正常。
二、使用环境
1)开发环境使用的是MDK5.20,下载器为JLINK;
2)软件工程是V6的FreeRTOS模板工程,SD卡驱动也是V6的,非系统延时函数所在文件为V6的 bsp_dwt.c;
3)硬件板子是自己做的,MCU是STM32F429ZGT6;
三、问题分析
1)硬件板子已使用了一段时间,工作都正常包括下店再上电的情况,故该问题排出了硬件电路的问题;
2)由于之前也遇见过这样的现象,再加之网络查找,和代码分析实验,最后将问题定在了延时 bsp_DelayMS(100);
3)工程代码- int main(void)
- {
- /*
- 在启动调度前,为了防止初始化STM32外设时有中断服务程序执行,这里禁止全局中断(除了NMI和HardFault)。
- 这样做的好处是:
- 1. 防止执行的中断服务程序中有FreeRTOS的API函数。
- 2. 保证系统正常启动,不受别的中断影响。
- 3. 关于是否关闭全局中断,大家根据自己的实际情况设置即可。
- 在移植文件port.c中的函数prvStartFirstTask中会重新开启全局中断。通过指令cpsie i开启,__set_PRIMASK(1)
- 和cpsie i是等效的。
- */
- __set_PRIMASK(1);
-
- /* 硬件初始化 */
- bsp_Init();
-
- /* 创建任务 */
- AppTaskCreate();
-
- /* 启动调度,开始执行任务 */
- vTaskStartScheduler();
- /*
- 如果系统正常启动是不会运行到这里的,运行到这里极有可能是用于定时器任务或者空闲任务的
- heap空间不足造成创建失败,此要加大FreeRTOSConfig.h文件中定义的heap大小:
- #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 30 * 1024 ) )
- */
- while(1);
- }
- /*
- *********************************************************************************************************
- * 函 数 名: vTaskTaskUserIF
- * 功能说明: 接口消息处理,这里用作LED闪烁
- * 形 参: pvParameters 是在创建该任务时传递的形参
- * 返 回 值: 无
- * 优 先 级: 1 (数值越小优先级越低,这个跟uCOS相反)
- *********************************************************************************************************
- */
- static void vTaskTaskUserIF(void *pvParameters)
- {
- while(1)
- {
- bsp_LedToggle(1);
- vTaskDelay(500);
- }
- }
- /*
- *********************************************************************************************************
- * 函 数 名: vTaskLED
- * 功能说明: LED闪烁
- * 形 参: pvParameters 是在创建该任务时传递的形参
- * 返 回 值: 无
- * 优 先 级: 2
- *********************************************************************************************************
- */
- static void vTaskLED(void *pvParameters)
- {
- while(1)
- {
- bsp_LedToggle(2);
- vTaskDelay(1000);
- }
- }
- /*
- *********************************************************************************************************
- * 函 数 名: vTaskMsgPro
- * 功能说明: 信息处理,这里是用作LED闪烁
- * 形 参: pvParameters 是在创建该任务时传递的形参
- * 返 回 值: 无
- * 优 先 级: 3
- *********************************************************************************************************
- */
- static void vTaskMsgPro(void *pvParameters)
- {
- while(1)
- {
- DemoFatFS();
- vTaskDelay(300);
- }
- }
- /*
- *********************************************************************************************************
- * 函 数 名: vTaskStart
- * 功能说明: 启动任务,也就是最高优先级任务,这里用作LED闪烁
- * 形 参: pvParameters 是在创建该任务时传递的形参
- * 返 回 值: 无
- * 优 先 级: 4
- *********************************************************************************************************
- */
- static void vTaskStart(void *pvParameters)
- {
- while(1)
- {
- /* 按键扫描 */
- bsp_LedToggle(4);
- vTaskDelay(400);
- }
- }
- /*
- *********************************************************************************************************
- * 函 数 名: AppTaskCreate
- * 功能说明: 创建应用任务
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void AppTaskCreate (void)
- {
- xTaskCreate( vTaskTaskUserIF, /* 任务函数 */
- "vTaskUserIF", /* 任务名 */
- 512, /* 任务栈大小,单位word,也就是4字节 */
- NULL, /* 任务参数 */
- 1, /* 任务优先级*/
- &xHandleTaskUserIF ); /* 任务句柄 */
-
-
- xTaskCreate( vTaskLED, /* 任务函数 */
- "vTaskLED", /* 任务名 */
- 512, /* 任务栈大小,单位word,也就是4字节 */
- NULL, /* 任务参数 */
- 2, /* 任务优先级*/
- &xHandleTaskLED ); /* 任务句柄 */
-
- xTaskCreate( vTaskMsgPro, /* 任务函数 */
- "vTaskMsgPro", /* 任务名 */
- 512, /* 任务栈大小,单位word,也就是4字节 */
- NULL, /* 任务参数 */
- 3, /* 任务优先级*/
- &xHandleTaskMsgPro ); /* 任务句柄 */
-
-
- xTaskCreate( vTaskStart, /* 任务函数 */
- "vTaskStart", /* 任务名 */
- 512, /* 任务栈大小,单位word,也就是4字节 */
- NULL, /* 任务参数 */
- 4, /* 任务优先级*/
- &xHandleTaskStart ); /* 任务句柄 */
- }
复制代码 问题就在上段代码第60行的延时函数 bsp_DelayMS(100); |
|