
介绍freertos在stm32上的移植说明,每一步都很详细,让你学会在stm32+freeRTOS的平台上开发应用程序
一、各文件关键部分的实现:1、PORTMACRO.H宏定义部分1)定义编译器相关的各种数据类型#defineportCHARchar#defineportFLOATfloat#defineportDOUBLEdouble#defineportLONGlong#defineportSHORTshort#defineportSTACK_TYPEunsignedportLONG#defineportBASE_TYPElong2)架构相关的定义Cortex-M3的堆栈增长方向为高地址向低地址增长#defineportSTACK_GROWTH(-1)每毫秒的心跳次数#defineportTICK_RATE_MS((portTickType)1000/configTICK_RATE_HZ)访问SRAM的字节对齐#defineportBYTE_ALIGNMENT83)定义用户主动引起内核调度的2个函数强制上下文切换,用在任务环境中调用#defineportYIELD()vPortYieldFromISR()强制上下文切换,用在中断处理环境中调用#defineportEND_SWITCHING_ISR(xSwitchRequired)if(xSwitchRequired)vPortYieldFromISR()4)定义临界区的管理函数中断允许和关闭#defineportDISABLE_INTERRUPTS()vPortSetInterruptMask()#defineportENABLE_INTERRUPTS()vPortClearInterruptMask()临界区进入和退出#defineportENTER_CRITICAL()vPortEnterCritical()#defineportEXIT_CRITICAL()vPortExitCritical()用于在中断环境的中断允许和关闭#defineportSET_INTERRUPT_MASK_FROM_ISR()0;vPortSetInterruptMask()#defineportCLEAR_INTERRUPT_MASK_FROM_ISR(x)vPortClearInterruptMask();(void)x2、PORT.CC接口部分1)堆栈初始化portSTACK_TYPE*pxPortInitialiseStack(portSTACK_TYPE*pxTopOfStack,pdTASK_CODEpxCode,void*pvParameters){*pxTopOfStack=portINITIAL_XPSR;/*程序状态寄存器*/pxTopOfStack--;*pxTopOfStack=(portSTACK_TYPE)pxCode;/*任务的入口点*/pxTopOfStack--;*pxTopOfStack=0;/*LR*/pxTopOfStack-=5;/*R12,R3,R2andR1.*/*pxTopOfStack=(portSTACK_TYPE)pvParameters;/*任务的参数*/pxTopOfStack-=8;/*R11,R10,R9,R8,R7,R6,R5andR4.*/returnpxTopOfStack;}2)启动任务调度portBASE_TYPExPortStartScheduler(void){让任务切换中断和心跳中断位于最低的优先级,使更高优先级可以抢占mcu*(portNVIC_SYSPRI2)|=portNVIC_PENDSV_PRI;*(portNVIC_SYSPRI2)|=portNVIC_SYSTICK_PRI;设置并启动系统的心跳时钟prvSetupTimerInterrupt();初始化临界区的嵌套的个数uxCriticalNesting=0;启动第一个任务vPortStartFirstTask();执行到vPortStartFirstTask函数,内核已经开始正常的调度return0;}3)主动释放mcu使用权voidvPortYieldFromISR(void){触发PendSV系统服务中断,中断到来时由汇编函数xPortPendSVHandler()处理*(portNVIC_INT_CTRL)=portNVIC_PENDSVSET;}进入临界区时,首先关闭中断;当退出所以嵌套的临界区后再使能中断voidvPortEnterCritical(void){portDISABLE_INTERRUPTS();uxCriticalNesting++;}voidvPortExitCritical(void){uxCriticalNesting--;if(uxCriticalNesting==0){portENABLE_INTERRUPTS();}}4)心跳时钟处理函数voidxPortSysTickHandler(void){unsignedportLONGulDummy;如果是抢占式调度,首先看一下有没有需要调度的任务#ifconfigUSE_PREEMPTION==1*(portNVIC_INT_CTRL)=portNVIC_PENDSVSET;#endifulDummy=portSET_INTERRUPT_MASK_FROM_ISR();{通过task.c的心跳处理函数vTaskIncrementTick(),进行时钟计数和延时任务的处理vTaskIncrementTick();}portCLEAR_INTERRUPT_MASK_FROM_ISR(ulDummy);}3、PORTASM.S汇编处理部分1)请求切换任务xPortPendSVHandler:保存当前任务的上下文到其任务控制块mrsr0,pspldrr3,=pxCurrentTCB获取当前任务的任务控制块指针ldrr2,[r3]stmdbr0!,{r4-r11}保存R4-R11到该任务的堆栈strr0,[r2]将最后的堆栈指针保存到任务控制块的pxTopOfStackstmdbsp!,{r3,r14}关闭中断movr0,#configMAX_SYSCALL_INTERRUPT_PRIORITYmsrbasepri,r0切换任务的上下文,pxCurrentTCB已指向新的任务blvTaskSwitchContextmovr0,#0msrbasepri,r0ldmiasp!,{r3,r14}恢复新任务的上下文到各寄存器ldrr1,[r3]ldrr0,[r1]/*ThefirstiteminpxCurrentTCBisthetasktopofstack.*/ldmiar0!,{r4-r11}/*Poptheregisters.*/msrpsp,r0bxr142.)中断允许和关闭的实现,通过BASEPRI屏蔽相应优先级的中断源vPortSetInterruptMask:push{r0}movR0,#configMAX_SYSCALL_INTERRUPT_PRIORITYmsrBASEPRI,R0pop{R0}bxr14vPortClearInterruptMask:PUSH{r0}MOVR0,#0MSRBASEPRI,R0POP{R0}bxr143)直接切换任务,用于vPortStartFirstTask第一次启动任务时初始化堆栈和各寄存器vPortSVCHandler;ldrr3,=pxCurrentTCBldrr1,[r3]ldrr0,[r1]ldmiar0!,{r4-r11}msrpsp,r0movr0,#0msrbasepri,r0orrr14,r14,#13bxr144)启动第一个任务的汇编实现vPortStartFirstTask通过中断向量表的定位堆栈的地址ldrr0,=0xE000ED08向量表偏移量寄存器(VTOR)ldrr0,[r0]ldrr0,[r0]msrmsp,r0将堆栈地址保存到主堆栈指针msp中触发SVC软中断,由vPortSVCHandler()完成第一个任务的具体切换工作svc0FreeRTOS内核调度器启动的流程如下:以上3个文件实现了FreeRTOS内核调度所需的底层接口,相关代码十分精简。
二、创建测试任务:下面创建第一个测试任务,LED测试intmain(void){设置系统时钟,中断向量表和LED使用的GPIO使用stm32的固件包提供的初始化函数,具体说明见相关手册prvSetupHardware();通过xTaskCreate()创建4个LED任务vLEDFlashTask(),每个任务根据各自的频率闪烁,分别对应开发板上的4个LEDvStartLEDFlashTasks(mainFLASH_TASK_PRIORITY);?创建一个IDLE任务后,通过xPortStartScheduler启动调度器vTaskStartScheduler();调度器工作不正常时返回return0;}portTASK_FUNCTION()是FreeRTOS定义的函数声明,没特殊作用staticportTASK_FUNCTION(vLEDFlashTask,pvParameters){……省略……,具体为计算各LED的闪烁频率for(;;){vTaskDelayUntil(&xLastFlashTime,xFlashRate);vParTestToggleLED(uxLED);vTaskDelayUntil()的延时时间xFlashRate,是从上一次的延时时间xLastFlashTime算起的,相对vTaskDelay()的直接延时更为精准。vTaskDelayUntil(&xLastFlashTime,xFlashRate);vParTestToggleLED(uxLED);}}FreeRTOS的任务创建与UC/OSII差异不大,主要参数为任务函数,堆栈大小和任务的优先级。如:xTaskCreate(vLEDFlashTask,(signedportCHAR*)"LEDx",ledSTACK_SIZE,NULL,uxPriority,(xTaskHandle*)NULL);下面再创建一个LCD显示任务,以最低优先级运行:xTaskCreate(vLCDTask,(signedportCHAR*)"LCD",configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY,NULL);voidvLCDTask(void*pvParameters){……省略……for(;;){vTaskDelay(1000);printf("%c",usDisplayChar);}}该任务很简单,每隔1000个ticks(就是1000ms),从LCD上刷新一个数字。至此,FreeRTOS在STM32上的移植基本完成。与UC/OSII相比,FreeRTOS精简的实现更适合用来学习实时操作系统的工作原理,对其进行剖析也相对容易。接下来,我们将会移植CAN,RS485,SD卡和USB等接口到FreeRTOS,使其在STM32平台上更加完善。
Tags:FreeRTOS.
batocera.linux游戏系统系统其它 / 535.29MB / 2010-9-29 / WinXP, Win7, win8 / / 小编点评:batocera.linux游戏系.
下载
照片数据恢复工具(Ashampoo Photo Recovery)数据恢复 / 451.55MB / 2010-6-3 / WinXP, Win7, win8 / / 小编点评:误删除了照片?记忆卡读不出来了?珍贵的照.
下载
新加坡系统休眠(Toolwiz BHORM)系统其它 / 399.79MB / 2023-4-16 / WinXP, WinAll / / 小编点评:是一个先进的工具,使您可以进入或退出HORM(.
下载
蚂蚁工具盒系统其它 / 678.53MB / 2017-12-17 / WinXP, WinAll / / 小编点评:蚂蚁工具盒是由蚂蚁巴士论坛所开发的一款综.
下载
易语言模块反编译分析全套源码源码相关 / 508.23MB / 2021-9-15 / WinAll / / 小编点评:易语言模块反编译分析全套源码是一款.
下载
深蓝Win7音量批量调整blueVolume系统其它 / 683.58MB / 2023-6-4 / Win7 / / 小编点评:深蓝Win7音量批量调整blueVo.
下载
顺风数据库工具V2.2.0.0下载 数据恢复 / 183.33MB / 2010-3-23 / Win8,Win7,WinXP / 简体中文 / 共享软件 小编点评:软件介绍顺风数据库工具能将MSSQL、.
下载
奇趣游戏盒子app下载安装-奇趣游戏盒子官方版下载v1.1.8 安卓版其他游戏 / 690.79MB / 2013-4-20 / Android / 中文 / 南宁华昇网络科技有限公司 / v1.1.8 安卓版 小编点评:奇趣游戏盒子官方版是一款资源丰富的游戏盒.
下载
果盘东方奇缘变态版下载-东方奇缘bt果盘版下载v3.4.0 安卓版变态手游 / 755.46MB / 2021-5-21 / Android / 中文 / v3.4.0 安卓版 小编点评:东方奇缘bt果盘版是一款q版西游题材的手游,
下载
战舞手游盒子下载-战舞手游助手下载v0.0.1 安卓版其他游戏 / 321.20MB / 2019-8-23 / Android / 中文 / v0.0.1 安卓版 小编点评:战舞手游助手是一款非常棒的游戏盒子软件。丰富.
下载
激光迷宫破解版下载-激光迷宫无限提示版游戏下载v1.0.1 安卓版益智休闲 / 206.4MB / 2021-5-25 / Android / 中文 / v1.0.1 安卓版 小编点评:激光迷宫破解版是简单有趣好玩智力游戏畅玩不停.
下载
泡泡龙大战最新版游戏下载-泡泡龙大战手机版下载v1.1.3 安卓版益智休闲 / 199.50MB / 2019-10-22 / Android / 中文 / v1.1.3 安卓版 小编点评:泡泡龙大战手机版是一款好玩的休闲泡.
下载
残暴鲨鱼冲浪者破解版下载-残暴鲨鱼冲浪者内购破解版下载v1.0.2 安卓版益智休闲 / 431.57MB / 2016-11-15 / Android / 中文 / v1.0.2 安卓版 小编点评:残暴鲨鱼冲浪者内购破解版是一款超级.
下载
没有刹车的大作战游戏下载-没有刹车的大作战中文版下载v1.0.2 安卓版
蜜糖连线破解版下载-蜜糖连线内购破解版下载v1.0 安卓版
魔法喵学院手机版下载-魔法喵学院游戏下载v1.0 安卓版
黑暗之盾游戏下载-黑暗之盾中文版下载v1.0 安卓版
疯狂弹簧高跷游戏下载-疯狂弹簧高跷手游下载v1.2 安卓版
主公带我飞手游变态版下载-主公带我飞星耀版下载v2.0 安卓bt版
影子战士战斗最新版下载-影子战士战斗手游下载v1.16.1 安卓版
五子棋双人经典版游戏免费下载-五子棋双人经典手游最新版下载v1.0.0 安卓版
龙城嘟嘟变态版下载-龙城嘟嘟bt版下载v2.0 安卓超v版
乱斗学院变态版下载-乱斗学院手游bt公益服下载v1.0.3 安卓私服
三国之空城计果盘游戏下载-三国之空城计果盘版下载v2.22.0 安卓最新版
奇思妙影app下载-奇思妙影官方版下载v2.1.12 安卓版
碰撞大作战游戏下载-碰撞大作战游戏官方版下载v1.3 安卓版
益智休闲 / 162.5MB / 2016-4-9 / Android / 中文 / v1.3 安卓版 下载
portal walk游戏下载-portal walk中文版下载v1.1 安卓版
益智休闲 / 629.99MB / 2017-2-15 / Android / 中文 / v1.1 安卓版 下载
粉碎房间游戏下载-粉碎房间手游下载v1.0 安卓版
益智休闲 / 836.51MB / 2015-7-29 / Android / 中文 / v1.0 安卓版 下载
串串达人游戏下载-串串达人手机版下载v1.6 安卓版
益智休闲 / 599.13MB / 2022-8-8 / Android / 中文 / v1.6 安卓版 下载
火炮传奇手游下载-火炮传奇破解版下载v1.3 安卓版
策略塔防 / 788.8MB / 2022-10-29 / Android / 中文 / v1.3 安卓版 下载
静止世界游戏下载-静止世界单机版下载v3.10.2 安卓版
益智休闲 / 68.15MB / 2011-10-5 / Android / 中文 / v3.10.2 安卓版 下载
宠魅商店版满v版下载-宠魅商店版bt版下载v1.0.0 安卓版
变态手游 / 161.57MB / 2010-12-19 / Android / 中文 / v1.0.0 安卓版 下载
战争总动员旧版下载-战争总动员老版本下载v1.7.3.130 安卓版
策略塔防 / 444.48MB / 2020-2-30 / Android / 中文 / v1.7.3.130 安卓版 下载
军舰帝国破解版下载-军舰帝国内购破解版下载v1.2.5 安卓最新版
策略塔防 / 730.67MB / 2014-5-27 / Android / 中文 / v1.2.5 安卓最新版 下载
战神大陆游戏下载-战神大陆手机版最新版下载v2.3.2 官方安卓版
策略塔防 / 581.72MB / 2016-10-1 / Android / 中文 / v2.3.2 官方安卓版 下载
猎鹰战记公测游戏下载-猎鹰战记官方测试版下载v1.0.18 安卓版
策略塔防 / 789.22MB / 2016-9-23 / Android / 中文 / v1.0.18 安卓版 下载
旋转舞姬内购版下载-旋转舞姬破解版下载v1.0.2 安卓版
益智休闲 / 901.80MB / 2014-6-24 / Android / 中文 / v1.0.2 安卓版 下载
nichi日常app最新版下载-nichi日常官方版下载v1.7.0.1 安卓手机版
摄影摄像 / 36.21MB / 2011-6-19 / Android / 中文 / 北京繆客科技有限公司 / v1.7.0.1 安卓手机版 下载