ARM-M架构移植UCOS操作系统

这篇具有很好参考价值的文章主要介绍了ARM-M架构移植UCOS操作系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        最近准备面试,把本科到现在的一些比赛相关的东西整理一下。那些年在飞思卡尔在K60单片机上的UCOSII移植(哎,心酸...)

        一、首先看下UCOSII的文件结构:

ucos系统,嵌入式,RTOS,嵌入式

一些核心的文件解释:

        【1、头文件】:

        includes.h:每个.c文件需要包含的头文件,注释掉不需要的头文件,可以配合裁剪

        os_cfg.h:对系统的配置和裁剪;(选择宏定义关闭某些功能(设置时间频率1000hz,配合滴答定时器的load值可以确定ucos的时基,用来确定调度的频率),如下图比如说关闭hooks和debug);

ucos系统,嵌入式,RTOS,嵌入式

         os_cpu.h:为了适应数据类型进行重定义,重点关注OS_STK这个数据类型,我们在定义任务堆栈的时候就是该类型数据;

ucos系统,嵌入式,RTOS,嵌入式

        【2、C文件】:

          os_cpu_c.c

        【3、汇编文件】:

          os_cpu_a.asm:

ucos系统,嵌入式,RTOS,嵌入式

        IMPORT表示这是一个外部变量,不是在本程序内定义的,EXPORT则表示该文件内这些函数,供其他文件调用;

圈1:OSStart()调用,开启多任务

圈2:触发PendSV中断,调用圈4,任务切换

圈3:开关中断

圈4:上下文切换(任务切换的最后调用)

        二、系统移植要解决的问题

        对比学习是效率最好的,当初移植也是参照stm32f1去移植的!

        在移植时ARM-M3/M4系统有两个比较重要的文件:系统启动文件和中断服务函数文件:

        K60(M4内核)/STM32F1(M3内核):startup_MK60D10.s/startup_stm32f10x_md.s

                                                                          system_MK60D10.c/stm32f10x_it.c

1、解决上下文切换函数的冲突:PendSV_Handler

        一般,在ARM-M3/M4系统的板载支持包会有一个叫 statup_xxx.s 的启动文件(K60和stm32f1分别是[startup_MK60D10.s/startup_stm32f10x_md.s]),文件中会定义CPU相关的中断向量表:

ucos系统,嵌入式,RTOS,嵌入式

 其中重要的,如

        SVC_Handler[产生系统调用就会产生svc异常,需要立即执行]、

        PendSV_Handler[可悬起的系统调用,可以缓期执行动作,用于上下文切换]、

       SysTick_Handler等[这几个中断接口只在启动文件中使用EXPORT导出符号,具体实现会在CPU的板载支持包中的中断服务函数的文件里实现([system_MK60D10.c/stm32f10x_it.c])、

        Reset_Handler[这个就在启动文件中实现的,完成系统工作频率的初始化,并跳转到__main函数,进入c环境开始运行应用层代码]),如下所示:

ucos系统,嵌入式,RTOS,嵌入式

ucos系统,嵌入式,RTOS,嵌入式

        问题:同样在UCOSII的源码文件os_cpu_a.asm中定义了PendSV_Handler函数,由于上下文切换需要极快的执行效率,因此保留ucosii中的汇编实现,注释掉M3/M4系统的板载支持的C语言实现;

2、M3/M4系统的会提供滴答定时器,将它作为UC系统的任务调度时钟:SysTick_Handler

        在M3/M4系统的启动文件【startup_MK60D10.s/startup_stm32f10x_md.s】,找到滴答定时器对应的中断函数表(函数名称),并在相应文件中实现该函数:(stm32是在中断服务文件stm32f10x_it.c中实现的,我在移植K60直接将它添加到os_cpu_c.c中去实现的也没问题):

ucos系统,嵌入式,RTOS,嵌入式

         这个函数主要是通过定时器装载值,出发定时器中断,然后去执行任务调度(ucos调度策略是任务优先级);中断频率在os_cfg.h文件的[OS_TICKS_PER_SEC]参数设置;

3、修改任务堆栈函数:OSTaskStkInit

        添加了解Cortex-M3的Stack frame(栈帧结构)。所以在修改UCOSII的堆栈初始化函数OSTaskStkInit()的时侯堆栈的顺序不能乱。xPSP寄存器的bit9被用来指示SP(堆栈指针)是否需要对齐,该函数将xPSR、PC、LR(R14)、R12、R0-R3这8个寄存器是CPU自动入栈,其余的8个寄存器R4-R11就需要我们自己手动入栈了,入栈顺序不能乱了。如果使用M4的FPU(浮点单元),则还需要入栈额外的寄存器,就需要去查阅对应手册。

ucos系统,嵌入式,RTOS,嵌入式

 ucos系统,嵌入式,RTOS,嵌入式

  

4、系统裁剪:

        os_cfg.h(节拍设置、功能选配等)、头文件:includes.h

5、应用程序main函数:在启动OS之前,一定要先完成 【系统时基的配置】以及【滴答定时器装载值的配置】,以保证UCOS按照固定频率触发中断,进行SysTick_Handler的调用,判断任务时候切换,进而触发PendSV进行任务切换:

ucos系统,嵌入式,RTOS,嵌入式

 --------------------------------------------------可以去写两个任务测试一下了... ...文章来源地址https://www.toymoban.com/news/detail-676934.html

到了这里,关于ARM-M架构移植UCOS操作系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LWIP——无操作系统移植

    目录 移植说明 LwIP前期准备  以太网DMA描述符 LwIP移植流程 添加网卡驱动程序 添加LwIP源文件  移植头文件 网卡驱动编写 移植总结  LwIP的移植可以分为两大类:第一类是只移植内核核心,此时用户应用程序编写只能基于RaW/CallBack API进行;第二类是移植内核核心和上层API函数

    2024年02月12日
    浏览(41)
  • LwIP带操作系统的移植

    目录 LwIP移植前期准备 LwIP移植流程 修改lwipopts.h 修改lwip_comm.c文件 修改ethernetif.c/h文件 修改ethernetif_input函数 修改ethernet.c文件 添加应用程序 LwIP是支持操作系统的,在操作系统的支持下我们可以使用LwIP提供的另外两种API编程接口编程。没有操作系统的时候,我们只能使用R

    2024年02月07日
    浏览(38)
  • STM32移植FreeRTOS操作系统

    一、FreeRTOS源码下载 (1)移植钱得准备前菜对吧,我们先来去官网瞄一瞄 网址:FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensions 第一步:点击下载FreeRTOS 第二步:选择版本下载(我选择稳定版本) 注:我们下载的稳定版本不包含DEMO例

    2024年01月17日
    浏览(36)
  • STM32FreeRTOS操作系统移植

    移植好的FreeRTOS模板: 链接:https://pan.baidu.com/s/1_87VQAWXUl4jTqSCZ0MFjw?pwd=dw52  提取码:dw52 1.在工程中新建FreeRTOS文件夹 2.把源码source里面的文件全部粘贴进FreeRTOS文件夹中  3.在portable文件中只保留一下文件,其余删除  4.新建如下两个文件夹  5.在FreeRTOS_CODE目录下添加以下文件

    2024年02月08日
    浏览(43)
  • 【Linux】银河麒麟V10 ARM架构_安装JDK8-kylinV10(Kylin Linux Advanced Server V10 )操作系统(CentOS8)

    🦄 个人主页——🎐开着拖拉机回家_大数据运维-CSDN博客 🎐✨🍁 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥 🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁🍁🪁🍁🪁 🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁🍁🍁🪁🍁 感谢点赞和关注 ,每天

    2024年02月05日
    浏览(67)
  • 【STM32】STM32 移植鸿蒙操作系统

    随着 OpenHarmony3.1 的正式发布,其功能也在不断完善。OpenHarmony LiteOS-M 内核是面向IoT领域构建的轻量级物联网操作系统内核,具有小体积、低功耗、高性能的特点,其代码结构简单,主要包括内核最小功能集、内核抽象层、可选组件以及工程目录等,分为硬件相关层以及硬件无

    2024年02月09日
    浏览(53)
  • 基于STM32的实时操作系统FreeRTOS移植教程(手动移植)_stm32移植freertos(1)

    直接意识代码: 这是我们大脑最希望的添加代码方式,很显然他是 错的 , 两个任务之间产生了相互的影响 ,使得两个任务都执行错误,这种思想在 裸机开发 中肯定是 错的 ,但是在我们的 RTOS 中他就可以是 对的 。 任务型代码: 这是 独立的两个任务内容 ,我们只需要把

    2024年04月10日
    浏览(105)
  • 如何剪裁操作系统源码——移植FreeRTOS的内存管理模块到ARMV8裸片

    本文面向的需求场景是,为缺乏标准库实现的处理器IP移植内存管理模块,即为裸片部署C标准库中的 malloc() 和 free() 函数。 具体做法是——从操作系统的内存管理组件中剪裁出必要的源码,适配到目标处理器的开发环境(SDK/IDE/CMAKE工程子目录)中。 1.1 C标准库中的内存管理

    2024年02月13日
    浏览(34)
  • 麒麟操作系统安装达梦数据库ARM版

    CPU架构:鲲鹏ARM 操作系统:Kylin Linux Advanced Server V10 默认试用1年 下载地址 上传安装包到/opt/soft目录下,并解压 vi /etc/security/limits.conf 在最后添加如下语句 增加如下内容 参数说明: 到root用户重启数据库 查看是否设置成功 权限说明: 达梦官方安装文档

    2024年02月09日
    浏览(48)
  • 【】鲲鹏ARM构架openEuler操作系统安装Oracle 19c

    作者:einyboy  【原创】鲲鹏ARM构架openEuler操作系统安装Oracle 19c | 云非云计算机科学、自然科学技术科谱 http://www.nclound.com/index.php/2023/09/03/%E3%80%90%E5%8E%9F%E5%88%9B%E3%80%91%E9%B2%B2%E9%B9%8Farm%E6%9E%84%E6%9E%B6openeuler%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85oracle-19c/ 一、操作系统版本 二、安

    2024年02月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包