FreeRTOS移值

您所在的位置:网站首页 p站助手手机版怎么开r18权限设置 FreeRTOS移值

FreeRTOS移值

#FreeRTOS移值| 来源: 网络整理| 查看: 265

FreeRTOS移值

首先需要获取源码包啊: http://www.freertos.org/到官网下载。 选出一般常用的几个文件: 在这里插入图片描述 在这里插入图片描述 把文件拷贝整理到一个文件夹FreeRTOS.然后把这个文件夹复制到STM32工程里面。 keil添加代码文件: 在这里插入图片描述 添加好之后,keil project添加.C文件 在这里插入图片描述 到此编译一次。 编译过程中会出现报错:未发现FreeRTOSConfig.h这个文件,到官网找一下这个.h,然后复制到自己的工程,我的建议是复制在FreeRTOS这个文件夹里面,方便以后移值。再次编译,还是有报错:void PendSV_Handler(void) void SVC_Handler(void)这两个中断函数重复了。FreeRTOS里面也配置有这两个函数,所以找到STM32工程的STM32F4xx_it.c把这两个函数屏蔽了。 再次编译还会有出错: void vApplicationIdleHook( void )这个函数没有 u32 getSysTickCnt(void)这个函数没有 void vApplicationMallocFailedHook( void )这个函数没有。一次性添加这三个函数:

void vApplicationIdleHook( void ) { static u32 tickWatchdogReset = 0; portTickType tickCount = getSysTickCnt(); if (tickCount - tickWatchdogReset > WATCHDOG_RESET_MS) { tickWatchdogReset = tickCount; watchdogReset(); } __WFI(); /*进入低功耗模式*/ } u32 getSysTickCnt(void) { if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED) /*系统已经运行*/ return xTaskGetTickCount(); else return sysTickCnt; } void vApplicationMallocFailedHook( void ) { portDISABLE_INTERRUPTS(); while(1); }

这三个函数添加的位置用户自己决定,我的是添加在STM32F4xx_it.c,方便使用。到此编译没有出现错误,下面就是编写最小的运行代码。 需要建立任务函数:

TaskHandle_t startTaskHandle; static void startTask(void *arg); //任务句柄 TaskHandle_t LED0Task_Handler; //任务函数 void led0_task(void *pvParameters); //任务句柄 TaskHandle_t LED1Task_Handler; //任务函数 void led1_task(void *pvParameters); /*创建任务*/ void startTask(void *arg) { taskENTER_CRITICAL(); /*进入临界区*/ xTaskCreate(led0_task, "LED0_TASK", 150, NULL, 3, (TaskHandle_t* )&LED0Task_Handler); /*创建无线连接任务*/ xTaskCreate(led1_task, "LED1_TASK", 150, NULL, 4, (TaskHandle_t* )&LED1Task_Handler); /*创建usb接收任务*/ vTaskDelete(startTaskHandle); /*删除开始任务*/ taskEXIT_CRITICAL(); /*退出临界区*/ } uint32 LED0_Count, LED1_Count; uint32 Sys_Time, Sys_TimeP; //LED0任务函数 void led0_task(void *param) { while(1) { Sys_Time = getSysTickCnt(); LED0_Count ++; vTaskDelay(1000); Sys_TimeP = getSysTickCnt() - Sys_Time; } } //LED1任务函数 void led1_task(void *param) { while(1) { LED1_Count ++; vTaskDelay(1000); } } 还有一个注意的点就是滴答定时器中断里面的处理,少了这个系统运行不正常的哦 void SysTick_Handler(void) { if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED) /*系统已经运行*/ { xPortSysTickHandler(); }else { sysTickCnt++; /*调度开启之前计数*/ } }

直接跑仿真,根据LED0_Count、LED1_Count这两个变量去判断代码运行情况,祝你成功。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3