
介绍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.
WIFI共享软件(lazy WiFi)网络共享 / 750.88MB / 2021-7-1 / WinAll / / 小编点评:lazyWiFii是一款免费的能够帮.
下载
2017NBA全明星扣篮大赛视频回放平台视频播放 / 159.96MB / 2023-5-1 / WinAll, WinXP, Win7, win8 / / 小编点评:2017年的NBA全明星正赛今天上午已经结.
下载
McAfee Labs Stinger 迈克菲杀毒软件其它杀软 / 429.78MB / 2014-11-19 / WinXP, WinAll / / 小编点评:想必友友们电脑里有装过动辄几百兆的杀.
下载
电脑屏幕尺桌面工具 / 730.91MB / 2020-8-8 / WinAll, WinXP, Win7 / / 小编点评:电脑屏幕尺是一款显示在电脑桌面上的屏幕.
下载
企鹅梦物语FC修改器修改器(游戏工具) / 656.55MB / 2015-4-18 / WinAll, WinXP, Win7 / / 小编点评:企鹅梦物语修改器是同名游戏的作弊器工具,
下载
房租婆QQ表情包QQ表情 / 889.61MB / 2013-2-5 / WinAll, Win7 / / 小编点评:非常搞笑的房租婆QQ表情包,很喜欢.
下载
多功能通讯录邮箱工具 / 298.62MB / 2016-9-24 / Win2003, WinXP, Win2000, Win9X / / 小编点评:多功能通讯录2.0.1使用说明:1、.
下载
Alternate Math Solver数学解算器教育学习 / 668.4MB / 2019-10-8 / WinAll / / 小编点评:AlternateMathSolv.
下载
美图秀秀20100329摇头娃娃素材包图片素材 / 968.12MB / 2022-10-20 / WinAll, WinXP / / 美图秀秀 / 小编点评:美图秀秀20100329娃娃素材包.
下载
chrome标签页管理插件Toby浏览辅助 / 409.55MB / 2011-6-1 / WinAll / / 小编点评:Toby是一款用于管理chrome标签.
下载
圆圆打字高手V3.0.0.0下载 电脑学习 / 180.11MB / 2021-6-23 / Win8,Win7,WinXP / 简体中文 / 免费软件 小编点评:软件介绍圆圆打字高手是一款打字练习及测试软.
下载
瑞易视频相册(视频相册制作软件)V2.2下载 图片处理 / 293.25MB / 2022-6-16 / Win8,Win7,WinXP / 简体中文 / 免费软件 小编点评:软件介绍瑞易视频相册自带一个万能M.
下载
宏达法院收付款管理系统V5.0.15.9493下载 财务管理 / 521.70MB / 2017-5-16 / Win8,Win7,WinXP / 简体中文 / 商业软件 小编点评:软件介绍本软件是专门为法院部门管理本单.
下载
手指召唤师游戏下载-手指召唤师菲巴萨莫下载v1.0.5 安卓版
阿拉德之路官方-阿拉德之路手游(暂未上线)v1.37.1.211795 安卓最新版本
ar距离测量仪app下载-ar距离测量仪手机版下载v1.2.7 安卓版
保卫珍珠港中文版下载-保卫珍珠港游戏下载v1.2.6 安卓汉化版
泡泡总动员加强版下载-泡泡总动员手机版下载v1.2.5 安卓最新版
100教育一对一辅导下载-100教育一对一辅导专家下载v3.10.2 安卓版
全城无忧app下载-全城无忧客户端下载v1.0.2 安卓版
社会人传奇bt变态版下载-社会人传奇超v版手游下载v1.2.0 安卓飞升版
飞英环保手机版下载-飞英环保app下载v1.1.0 安卓版
汽水星座馆软件下载-汽水星座app下载v1.3.7 安卓手机版
个税计算器pro版官方下载安装-个税计算器pro软件(改名新个税计算器)下载v1.1.3 安卓最新版
华西云课堂app安卓下载安装-华西云课堂官方版下载v1.3.14 安卓版
网趣网上购物系统时尚版V14.0下载
程序源码 / 351.34MB / 2016-5-22 / Win8,Win7,WinXP / 简体中文 / 免费软件 下载
淘宝刷动态评分软件V4.2.9下载
进销存软件 / 323.75MB / 2014-7-15 / Win8,Win7,WinXP / 简体中文 / 试用软件 下载
Wave flow(音频编辑软件)V5.8免费版下载
音频处理 / 513.41MB / 2018-9-27 / Win7,Vista,Win2003,WinXP / 英文 / 共享软件 下载
PE文件读写工具下载-PE文件读写软件 v12.26 绿色版
文件管理 / 126.51MB / 2022-11-18 / WinAll / 简体中文 / 免费软件 下载
好实再增客系统app下载-好实再增客系统 v4.2.2 手机版
生活服务 / 619.69MB / 2020-6-30 / / 下载
新浪万剑辅助工具V2.3.5免费版下载
游戏辅助 / 219.86MB / 2018-9-6 / Win10,Win8,Win7,WinXP,Win2000 / 简体中文 / 免费软件 下载
爱心对对碰(暂未上线)
智力游戏 / 814.24MB / 2021-2-6 / Win8,Win7,Vista,WinXP / 英文 / 免费软件 下载
空之岛失落王国官方下载-空之岛失落王国手游下载v1.01.013 安卓版
角色扮演 / 16.34MB / 2013-3-1 / Android / 中文 / 本星工作室 / v1.01.013 安卓版 下载
乐高得宝世界免费下载-乐高得宝世界游戏下载v2.6.1 安卓版
儿童教育 / 254.13MB / 2022-10-5 / Android / 中文 / v2.6.1 安卓版 下载
宝宝爱识物学英语游戏下载-宝宝爱识物学英语最新版下载v1.0.0 安卓版
儿童教育 / 857.5MB / 2016-1-11 / Android / 中文 / 丙文科技(唐山)有限责任公司 / v1.0.0 安卓版 下载
动物狂欢派对官方版下载-动物狂欢派对游戏下载v1.0 安卓版
益智休闲 / 15.29MB / 2010-5-8 / Android / 中文 / 武汉市乃乐奇网络科技有限公司 / v1.0 安卓版 下载
feelunique下载安卓-feelunique中文官方版下载v3.2.0 安卓版
网络购物 / 76.37MB / 2016-8-4 / Android / 中文 / 深圳市海豚村信息技术有限公司 / v3.2.0 安卓版 下载
分钟视频官网下载-分钟视频app下载v1.1.33 安卓版
视频播放 / 67.36MB / 2016-1-27 / Android / 中文 / v1.1.33 安卓版 下载