王超的小站
认证:VIP会员
所在专题目录 查看专题
FreeRTOS移植详解1-专题概览(基于Microchip dsPIC33C系列芯片)
FreeRTOS移植详解2-滴答定时器实现(基于Microchip dsPIC33C系列芯片)
FreeRTOS移植详解3-内核裁剪(基于Microchip dsPIC33C系列芯片)
FreeRTOS移植详解4-中断配置(基于Microchip dsPIC33C系列芯片)
FreeRTOS移植详解5-临界段处理(基于Microchip dsPIC33C系列芯片)
FreeRTOS移植详解6-任务堆栈初始化和启动(基于Microchip dsPIC33C系列芯片)
作者动态 更多
PIC24 & dsPIC33 MCU Bootloader开发
2021-11-08 15:12
PIC16 & PIC18 MCU Bootloader开发
2021-11-08 15:00
Python开发环境搭建(for Bootloader)
2021-11-08 14:58
Python开发环境搭建 (for Control)
2021-01-27 18:43
MCU扩展CAN/CAN FD接口方案-MCU软件动手实验
2020-11-25 14:11

FreeRTOS移植详解2-滴答定时器实现(基于Microchip dsPIC33C系列芯片)

      在介绍内核裁剪之前,首先介绍一下滴答定时器的实现,为什么把它放在靠前的位置呢,因为这个东西相对于RTOS来说就像我们人类的心脏,是RTOS活着的基础。那么心跳如何实现呢,对于基于ARM架构的芯片(如ATSAMD21或ATSAMD51)通常用24位的SysTick定时器来实现,也就是大家常说的系统滴答定时器,通过该定时器为系统提供一个周期性的定时信号,该定时信号就是RTOS的心跳信号,通常也称为时钟节拍或系统节拍。对于dsPIC33C系列芯片,则可以用通用定时器Timer1(Datasheet中其框图如下图,红色字体为项目工程中的实际配置情况)来实现,每个Timer1时钟节拍中断都会触发OS内核执行一些系统调用,比如进行任务管理和任务切换等。 

      下面结合上面Timer1的框图一起来看下Timer1的初始化代码实现,该段代码在项目目录“./src/third_party/rtos/FreeRTOS/portable/MPLAB/PIC24_dsPIC”下port.c中实现,详见函数vApplicationSetupTickTimerInterrupt(),具体细节如下:

      上图红色字体中前3项配置将在下一节内核裁剪中进行说明,这里需要知道以上TIMER1初始化代码的意思就是Timer1定时器要100us中断一次,且其中断优先级设置为最低优先级。那么Timer1的中断函数里做什么事情呢,代码实现同样在port.c中。

      其大概意思就是通过xTaskIncrementTick()函数进行任务管理,如果当前任务的优先级有多个任务(同时configUSE_PREEMPTION和configUSE_TIME_SLICING配置为1,即 使能了时间片调度  ),那么就需要通过portYIELD()函数进行一次任务切换。portYIELD()函数是针对不同MCU移植FreeRTOS的重中之重,在后续任务切换部分进行详细介绍。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 6
收藏 6
关注 42
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧