版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、伟研科技 广州伟研电子科技仃限公司FREERT0S 在 STM 32 的移植伟研科技 hllp:/ www.只 V 1.0FreeRTOS作为开源的轻屋级实时性操作系统,不仅实观了皋本的实时调度、信号屋、队列和存储管理,而 且在商业应用上不需要授权费。FreeRTOS的实现主要由list.c、queue.c, croutine.c和tasks.c 4个文件组成 list.c是一个链表的实现,主要 供给内核调度器使用:queue.c是一个队列的实现,支持中断环境和信号量控制;croutine.c和task.c是两种任务 的组织实现。对于croutine,乞任务共亨同一个堆栈,使RAM的需求进一步
2、缩小,但也止因如此,他的使用受 到相对严格的限制。而task则是传统的实现,«任务使用??门的堆栈,支持完全的抢占式调度.FreeRTOS的主耍功能可以归结为以下几点:1)优先级调度、相同优先级任务的轮转调度,同时可设成可剥夺内核或不可剥夺内核2)任务可选择是否共亨堆(co-routines& tasks),并1没冇任务数限制3)消息队列,二值信号鼠,计数信号量,递归互斥体4)时间管理5)内存管理与UC/OSII -样,FreeRTOS在STM32的移植大致由3个文件实现,一个.h文件定义编诽器相关的数据类型 和中断处理的宏定义:一个.c文件实现任务的堆栈初始化、系统心跳的管
3、理和任务切换的请求;一个.s文件实 现几体的任务切换.在本次移植中,使用的编译软件为IAREWARM 5.2。各文件关键部分的实现:PORTMACRO.H宏定义部分1宦义编译器相关的各种数据类型fdefine portCHAR#define portFLOAT#define portDOUBLE#define portLONG#define portSHORTchar float doublelong short#define portSTACK_TYPE#defineportBASE_TYPEunsigned portLONG long2. 架构相关的定义Cortex-M3的堆栈増长方向为高
4、地址向低地址増长#define portSTACK_GROWTH(1)毎毫秒的心跳次数#define portTICK_RATE_M S访问SRAM的字节对齐(portTickType ) 1000 / configTICK_RATE_HZ)#define portBYTE_AUGNM ENT83. 定义用户主动引起内核训度的2个函数强制上下文切换,用在任务环境中调用#define portYIELD()vPortYieldFromlSR()强制上下文切换,用在中断处理环境中调用#define portEND_SWITCHING_ISR( x 刖 itchRequired )if| xSw i
5、tch Required ) vPortYieldFromlSR()4. 宦义临界区的管理函数中断允许和关闭#define portDISABLE_INTERRUPTS()vPortSetlnterruptMask()#define portENABLE_INTERRUPTS()vPortClearlnterruptMask()临界区进入和退出#define portENTER_CRITICAL()#define portEXITCRITICALf)vPortEnterCriticalf) vPortExitCritical()用于在中断环境的中断允许和关闭#define portSET_IN
6、TERRUPT_M ASK_FR0M _ISR()0;vPortSetlnterr叩tM ask()#define portCLEAR_INTERRUPT_M ASK_FR0M_ISR(x) vPortClearlnterruptM ask();(void)xPORT.C C接口部分1 堆栈初始化portSTACK_TYPE * pxPortlnitialiseStack) portSTACK_TYPE 'pxTopOfStack, pdTASK_CODE pxCode.void *pvParameters j s订叩OfStack = portlNITIAL_XPSR:/* 程序状态
7、寄存器pxTopOfStack-;-pxTopOf Stack = ( port STACK J YPE) pxCode;/* 任务的入I 点 f/pxTopOfStack-; 'pxTopOfStack = 0; pxTopOfStack -=5;/* LR*/* R12,R3,R2and R1/pxTopOfStack = ( portSTACKJYPE) pvParameters; /* 任务的参数pxTopOfStack -=8;/* R1XR10、R9.R&R7, R6, R5 and R4.*/return pxTopOfStack;)2. 启动任务训度portBA
8、SE_TYPE xPortStartScheduler( void)让任务切换屮断和心跳小断位于瑕低的优先级,使更高优先级可以抢占mcu* (portNVIC_SYSPRI2)| = portNVIC_PENDSV_PRI;* (portNVIC_SYSPRI2)| = portNVIC_SYSTICK_PRI;设置并启动系统的心跳时钟prvSetupTimerlnterrupt();初始化临界区的嵌套的个数uxCriticalNesting = 0;,白动第一个任务vPortStartFirstTaskf);执行到vPortStartFirstTask国数,内核已经开始止常的调度 retur
9、n 0;3. 主动释放mcu便用权void vPortYieldFrom ISR( void )触发PendSV系统服务屮断,中断到來时由汇编函数xPortPendSVHandler()处理 *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET;进入临界区时,旨先关闭中断;当追出所以嵌套的临界区后再使能中断void vPortEnterCritlcal( void)portDISABLE_INTERRUPTS();uxCriticalNesting+;void vPortExitCritical( void )uxCriticalNesting-;if( uxCr
10、iticalNesting = 0 )(portENABLE_INTERRUPTS();)4.心跳时钟处理函数void xPortSysTickHandlerf void )unsigned portLONG ulDummy;如果是抢占式调度,忡先看一下有没有需要调度的任务#if configUSE_PREEM PTION = 1 (portNVIC_INT_CTRL) = portNVIC_PENDSVSET;lendifulDummy = portSET_INTERRUPT_M ASK_FRO M_ISR();|通过task.c的心跳处理函数vTasklncrementTickQ,进行时钟
11、计数和延时任务的处理vTasklncrementTick();)portCLEARJNTERRUPT_M ASK.FROMSR( ulDummy );PORTASM.S汇编处理部分1 诸求切换任务xPortPendSVHandler:保存当耐任务的h卜丈到其任务控制块mrsrO, pspIdrr3, =pxCurrentTCB获取当耐任务的任务控制块指针Idrr2fr33伟研科技 广州伟研电子科技仃限公司#伟研科技 广州伟研电子科技仃限公司stmdbr0!,r4-r11保#R4-R11到该任务的堆栈#伟研科技 广州伟研电子科技仃限公司strr05r2将最后的堆栈指针保心到任务控制块的pxTop
12、OfStackstmdb sp!f r3, r14)关闭中断mov rO. #configM AX_SYSCALL_INTERRUPT_PRIORITY msr basepri, rO切换任务的卜下文,pxCurrentTCB已指向新的任务5fli 研科技 http:/w 广州伟研电子科技有限公司#fli 研科技 http:/w 广州伟研电子科技有限公司bl vTaskSwitchContextmov r0,#0msr basepri, rOIdmia sp!, (r3, r14恢复新任务的上下文到各寄#器Idr rl, r3Idr rO, r1Idmia rO!, (r4-r11msr ps
13、pf rObx r14/* The first item in pxCurrentTCB isthe task top of stack./ r Pop the registers.f/任务切换的示总图如E:保存当前任务上下文通过进程堆栈指针PSP,将R4-R11保存到该任务的堆栈将新的栈顶指针保存到pxCurrentTCB->pxTopOfStack选择新任务通过 vTaskSwitchContext()更新 pxCurrentTCB 指针 pxCurrentTCB指针指向当前优先级最高的任务通过pxCurrentTCB->pxTopOfStack恢复新任务的栈顶指针 恢复R4R
14、11并更新进程堆栈指针PSP2中断允许和关闭的实现.通过BASEPRI屏蔽相应优先级的中断源 vPortSetlnterruptMask:push rOmov RO, #configMAX_SYSCALL_INTERRUPT_PRIORITYmsr BASEPRI, ROpop RObx r14vPortClearlnterruptMask:PUSH(rOMOV R0,#07fli 研科技 http:/w 广州伟研电子科技有限公司MSRBASEPRI,ROPOP RO)bx r143.4接切换任务,丿U J:vPortStatFirstTask第-次启动任务时初始化堆栈和各寄心器 vPortS
15、VCHandler;Idr r3, =pxCurrentTCBIdr rl, r3ldrrO,r1Idmia rO!, r4-r11msr psp, rOmov rO. #0msr basepri, rOorr r14,r14,#13bx r144.启动第-个任务的汇编实现vPortStartFirstTask通过屮断向屋衣的定位堆栈的地址Idr rO, =0xE000ED08向呈衣偏移屋寄心器(VTOR)Idr rO, rOIdr rO, rOmsr msp,rO将堆栈地址保"到主堆栈指针msp 'I'触发SVC软中断,曲vPortSVCHandler()成第-个任
16、务的从体切换工作 svc 0FreeRTOS内核调度器启动的流程如F:#fli 研科技 http:/w 广州伟研电子科技有限公司设置屮断优先级配置心跳时钟定位堆栈地址触发SVC软中断初始化任务环境调度器开始工作vPortSVCHandler以卜3个文件实现了 FreeRTOS内核调度所需的底层接11,相关代码I分粘简。创建测试任务:下面创建第一个测试任务,LED测试int main(void)设置系统时钟,中断向量表和LED使用的GPIO使用stm32的固件包提供的初始化函数.11体说明见和关丁册 prvSetupHardware();通过 xTaskCreated创建 4 个 LED 任务
17、vLEDFlashTask(), 毎个任务根据各门的频率闪烁,分别对应开发板上的4个LED vStart LED Flash Tasksf m ai n FLASH_TASK_PRIORITY);创建-个IDLE任务后,通过xPortStartScheduler启动调度器vTaskStart Scheduler);调度器工作不止常时返回return 0;)portTASK_FUNCTION()JZi FreeRTOS定义的函数声明,没特殊作用static portTASK_FUNCTION( vLEDFIashTask, pvParameters)省略.具体为计算各LED的闪烁频率加(;)vT
18、askDelayllntil( & xLast Flash Tim et xFlash Rate);vParTestToggleLED( uxLED);vTaskDelayllntil()的延时时间x Flash Rate,是从上-次的延时时间x Last Flash Time算起的, 相对vTaskDelay()的宜接延时更为粘准。vTaskDelayUntllf &xLast Flash Time, xFlash Rate);vPa订estToggleLED( uxLED );)FreeRTOS的任务创建与UC/OSII签异不人,主要参数为任务函数,堆栈人小和任务的优先级。如:xTaskCreate( vLEDFIashTask, (signed portCHAR* ) "LEDx", ledSTACK_SIZE, NULL, uxPriority, (xTaskHandle * ) NULL);Mhi再创建一个LCD显示任务,以最低优先级运行:xTaskCreate( vLCDTask. (signed portCHAR * )*LCD", configM IN IM AL_STACK_SIZE. NULL. tskIDLE, PRIORITY, NULL);void vL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 招标须知购车招标要求3篇
- 居民区煤气供应与安全责任合同3篇
- 教育培训机构砌体施工合同3篇
- 教育服务行业劳动合同标准3篇
- 教育机构劳动合同原件3篇
- 展览展示浮雕施工协议
- 企业教育贷款还款协议
- 防火设施维修施工合同
- 实验室门套翻新合同
- 建筑施工租赁吊车合同
- 建设银行2024年信贷政策与结构调整方案
- 土地托管协议范本
- 黑龙江省佳木斯二中2024-2025学年高一上学期期中考试化学试题(无答案)
- 安装通风管道安全协议书
- 浙教版七年级科学上册期末综合素质检测含答案
- 2023年中国铁路南昌局集团有限公司招聘笔试真题
- 2024年江苏省泰州市保安员理论考试题库及答案(完整)
- 2024秋期国家开放大学《公共行政学》一平台在线形考(形考任务一至三)试题及答案
- 2025届高考英语大作文读后续写写作思路与技巧课件
- 成品油运输投标方案(技术方案)
- 2024年云南省昆明滇中新区公开招聘20人历年高频500题难、易错点模拟试题附带答案详解
评论
0/150
提交评论