当前位置: 首页 > news >正文

52Hz——FreeRTOS学习笔记——FReeRTOS移植遇到的问题

中断服务程序映射背后的工作原理

#define vPortSVCHandler SVC_Handler

#define xPortPendSVHandler PendSV_Handler

#define xPortSysTickHandler SysTick_Handler

1. 核心概念:为什么需要这种映射?

  • CMSIS标准名称: ARM为Cortex-M内核定义了所有内核中断的标准名称。在你的STM32启动文件(如startup_stm32f4xx.s)的中断向量表中,你会看到这些标准名称,例如 SVC_Handler, PendSV_Handler, SysTick_Handler。这是芯片厂商(ST)遵循的标准。

  • FreeRTOS的函数名称: FreeRTOS在实现其内部功能时,为这三个关键中断定义了它自己的函数名:

    • vPortSVCHandler()

    • xPortPendSVHandler()

    • xPortSysTickHandler()

如果不做任何处理,当发生SysTick中断时,CPU会去向量表里找到 SysTick_Handler 并执行它,但FreeRTOS的代码却存在于 xPortSysTickHandler 函数里。这就会导致“找不到函数”的错误,或者你不得不自己去写一个 SysTick_Handler 来调用FreeRTOS的函数。

为了解决这个“名不匹配”的问题,最优雅的方法就是使用C语言的宏定义(#define)进行名称映射

2. 逐行解释

#define vPortSVCHandler SVC_Handler
  • SVC(系统服务调用)中断

    • 用于启动调度器。在FreeRTOS中,vTaskStartScheduler() 函数会触发一个SVC异常,在SVC的中断服务程序中,会执行第一个最高优先级的任务。

    • 这行代码的意思是:将所有代码中出现的 vPortSVCHandler 文本替换为 SVC_Handler

    • 因此,当CPU响应SVC中断时,它会跳转到启动文件里定义的 SVC_Handler,而这个名称已经被我们“偷梁换柱”成了FreeRTOS真正的实现函数 vPortSVCHandler

#define xPortPendSVHandler PendSV_Handler
  • PendSV(可挂起的系统调用)中断

    • 这是FreeRTOS执行任务上下文切换(Task Switching) 的地方。当需要切换任务时(例如时间片用完、任务阻塞),调度器会“悬挂”一个PendSV异常。在PendSV的中断服务程序中,会保存当前任务的现场(寄存器值到任务栈),并恢复下一个任务的现场。

    • 这行代码的意思是:将所有代码中出现的 xPortPendSVHandler 文本替换为 PendSV_Handler

    • 因此,当CPU响应PendSV中断时,它会跳转到 PendSV_Handler,实际上执行的是FreeRTOS的 xPortPendSVHandler 函数。

#define xPortSysTickHandler SysTick_Handler
  • SysTick(系统节拍定时器)中断

    • 这是系统的心跳(Tick)中断。它以固定的频率(通常为1ms或1000Hz)发生,是FreeRTOS调度器工作的时间基准

    • 在每个SysTick中断中,FreeRTOS会:

      1. 更新系统时钟计数器(xTickCount)。

      2. 检查是否有延迟的任务需要被唤醒。

      3. 如果使用了时间片轮转调度,会检查当前任务的时间片是否用完,并决定是否进行任务切换(通过悬挂PendSV)。

  • 这行代码的意思是:将所有代码中出现的 xPortSysTickHandler 文本替换为 SysTick_Handler

    • 因此,当CPU响应SysTick中断时,它会跳转到 SysTick_Handler,实际上执行的是FreeRTOS的 xPortSysTickHandler 函数,从而驱动整个操作系统的心跳。

3. 总结与工作流程

FreeRTOS中的实际函数名#define 映射后中断作用对FreeRTOS的重要性
vPortSVCHandlerSVC_Handler启动调度器,开始执行第一个任务关键,没有它调度器无法正确启动。
xPortPendSVHandlerPendSV_Handler执行实际的任务上下文切换核心,所有多任务切换都发生在这里。
xPortSysTickHandlerSysTick_Handler提供系统时钟节拍,驱动任务调度基础,没有它系统就失去了“心跳”,无法进行基于时间的调度。

整个工作流程可以这样理解:

  1. 你的代码编译时,编译器看到的是 SysTick_Handler 等CMSIS名称。

  2. 预处理器在编译之前,根据 FreeRTOSConfig.h 中的 #define 指令,将FreeRTOS源码中所有的 xPortSysTickHandler 都替换成了 SysTick_Handler

  3. 因此,FreeRTOS的SysTick处理函数现在“拥有”了标准的 SysTick_Handler 这个名字。

  4. 链接器将启动文件中的中断向量表项 SysTick_Handler 链接到了FreeRTOS提供的函数实现上。

  5. 当中断发生时,CPU就能准确地跳转到FreeRTOS的代码去执行。

结论:这三行代码是确保FreeRTOS能够“接管”Cortex-M内核的三个关键中断,从而正常运作的基石。 如果没有它们,FreeRTOS将无法与你的STM32硬件底层正确连接,调度器也无法工作。这是在STM32(或任何Cortex-M芯片)上移植FreeRTOS时必须完成的标准步骤。

http://www.dtcms.com/a/399443.html

相关文章:

  • 网站建设肆金手指排名7全网通网站
  • AI赋能互联网广告变现的商业模式
  • 52Hz——FreeRTOS学习笔记——删除任务
  • AI 重塑教育生态:从个性化学习到公平鸿沟
  • 将二级域名 网站目录网站首页排名下降
  • 实现Word文档自动编号提取技术详解
  • 超越OCR:深入智能文档处理(IDP)的技术内核与实现路径
  • 江苏自助建站平台html5游戏开发
  • SQL server 2022下载安装详细教程
  • 工业视觉缺陷检测算法总结:从传统到深度学习,5类核心算法
  • 建设银行网站打不开别的网站可以口碑好的移动网站建设
  • 网站怎么建设原始站点定制网站的好处有哪些
  • 推动商用车辆原始设备制造商(OEM)向集中式电子电气架构(E/E,Electrical/Electronic)与软件架构转型
  • 网站内页模板玉溪市住房城乡建设局网站
  • Navicat 数据库管理工具简介​以及免费绿色版下载安装包分享 不登录csdn也可以直接使用
  • 第二章:Qt第一个程序
  • APache shiro-550 CVE-2016-4437复现
  • 计算机视觉笔试选择题:题组2
  • 荣耀手机商城官方网站入口唐山网页设计
  • 凉山西昌网站建设网站公司可以做英文网吗
  • 软件开发转测试的过程中, UT测试如何体现
  • Si掺杂AlN薄膜在肖特基中的应用
  • 四种Linux进程管理工具使用详解
  • 软件的自动化测试平台
  • 分享天气预报走势图和未来7日预报静态HTML
  • 如何建立国际网站网站建设现状调查研究
  • JVM(六)-- StringTable
  • SpringBoot面试
  • 网站建设技术课程设计报告保定市网站制作公司
  • 如何处理JavaScript渲染的登录页面?Selenium自动化登录指南