freeRTOS移植——初步分析

本文详细分析了freeRTOS在嵌入式系统中的移植重点,包括中断管理、任务切换、初始化任务栈和调度器启动。介绍了如何配置ISR、初始化任务栈,以及启动调度器的步骤。同时,讲解了中断处理流程,包括压栈、用户自定义处理和出栈,以及中断向量表的注册。最后,阐述了freeRTOS的任务切换机制,强调了在ISR中触发任务切换和临界区管理的关键宏。

基于之前的分析,freeRTOS的移植主要集中在以下部分,

·       中断管理,包括ISR的配置、中断的关闭和开启等。

·       TASK切换处理,包括触发TASK切换、TASK切换的出栈和压栈操作等。

·       freeRTOS的基本配置和可选配置

·       Heap管理,

它们对应的源文件如下

·       portable.h,申明了中断管理和TASK切换管理相关的函数申明,用户可以自行增减

·       freeRTOS_Config.h,定义了freeRTOS的各类配置的宏,用于可以根据需要进行配置

·       Heap_X.c,X=1~5,用户可以自行选择freeRTOS提供的heap模型,也可以自行开发

 

移植之前必须清楚待移植嵌入式系统的硬件架构,尤其是CPU和存储器的相关细节。后边将一一提到。实际上freeRTOS需要移植的必要代码都已经在portable.h中声明(不含freeRTOS_Config.h配置的可选功能),我们只需要按照该文件填写好对应的宏和函数即可。

以下将以freeRTOS官网上给出的基于ZYNQ_ZC702的工程,对一些常见的需要移植的代码进行分析。

初始化Task Stack

对应函数声明强制如下,

StackType_t*pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void*pvParameters )

其在freeRTOS创建TASK时被调用,用于初始化TASK的STACK,细节参考API函数xTaskCreate()、xTaskCreateStatic()、xTaskCreateRestricted和xTaskCreateRestrictedStatic()。

该函数的处理十分简单,实际就是压栈过程,但寄存器的取值完全用用户确定,但是需要注意以下几点

·       寄存器压栈的顺序完全由用户确定,一般是建议按照寄存器的类型和编号来确定,以便于维护

·       Stack Address Register对应的栈内位置存放TASK入口函数地址

·       TASK入口函数的入参按照CPU要求存放在相应寄存器对应的栈内位置——一般而言,编译器会指定某些寄存器专门用于存放函数入参。

·       TASK入口函数的返回值初始化为一特定值,按照CPU要求存放在相应今存其对应的栈内位置——一般而言,编译器会指定某一寄存器专门用于存放函数返回值。

·       压栈之前先想栈内写入一些特殊值,可用于检测栈是否被异常改写。

前两点需要用户查询CPU相关硬件手册,是必须做的。后两者并不强制要求,但

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值