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

news2024/11/16 21:34:49

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

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

一些核心的文件解释:

        【1、头文件】:

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

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

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

        【2、C文件】:

          os_cpu_c.c

        【3、汇编文件】:

          os_cpu_a.asm:

        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相关的中断向量表:

 其中重要的,如

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

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

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

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

        问题:同样在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调度策略是任务优先级);中断频率在os_cfg.h文件的[OS_TICKS_PER_SEC]参数设置;

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

        添加需要手动入栈的寄存器,实际上,任务堆栈函数是在任务创建函数中调用OSTaskCreate,Stack frame一开始的地址是一个空区域。所以在修改UCOSII的堆栈初始化函数OSTaskStkInit()的时侯堆栈的向第一个位置写0就是这么来的,【也就是OSTaskCreate函数传入第二个参数为0,向R0写0】。xPSP寄存器的bit9被用来指示SP(堆栈指针)是否需要对齐,该函数将xPSR、PC、LR(R14)、R12、R0-R3这8个寄存器自动入栈,其余的8个寄存器R4-R11就需要我们自己手动入栈了,入栈顺序不能乱了。如果使用M4的FPU(浮点单元),则还需要入栈额外的寄存器,就需要去查阅对应手册。

 

  

4、系统裁剪:

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

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

 --------------------------------------------------可以去写两个任务测试一下了... ...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/634702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL多表查询常用语句总结

一、多表关系 (一)概述 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,…

【MySQL】数据库中表的操作

表的操作 一、创建表 --- create table 表名(列名 类型 ...);1.1 创建表的案例 二、查看表2.1 查看选中数据库的所有表 --- show tables;2.2 查看(描述)表结构 --- desc 表名;2.3 查看建表信息 --- show create table 表名 \G 三、修改表 --- alter3.1 修…

说说我认为的AI和人类的未来

今天闲来无事,花了半天时间部署了一个Stable Diffusion的开源AI生成图片程序,因为电脑配置的原因,找了一个小模型集测试了一下效果,总的来说还是挺震惊的。上图是通过输入:长发美女森林漫步红色裙子 这三个关键词后花了…

useEffect的基础知识和底层机制

useEffect 是 React 中一个重要的 Hook,用来处理组件的副作用操作。它的基础知识包括两个方面:执行时机和参数。 执行时机: useEff ect 的执行时机包括两种情况: 组件挂载时,即第一次渲染之后。组件更新时&#xff…

pandas---Series与DataFrame索引、切片;多层索引、索引的堆叠

1. Series的索引和切片 1.1 Series的索引: 可以使用中括号取单个索引(此时返回的是元素类型),或者中括号里一个列表取多个索引(此时 返回的仍然是一个Series类型)。分为显示索引和隐式索引: …

后台服务接口间大文件的流式发送和读取

文章目录 介绍代码设计代码参考客户端代码服务器端代码测试实例 介绍 使用HTTP协议进行数据流式传输是一种常见的方法。对于大文件数据传输可以使用HTTP的chunked编码或使用多部分响应来实现数据流式传输。 【HTTP的chunked编码】在发送数据的服务中,可以将数据切分…

postman接口测试学习笔记(非常详细)

目录 引言 1. 资源 2.接口测试 3. 接口返回数据和JSON详解 4.接口测试协议 5.企业接口测试的流程和方案 6. 接口测试工具以及Postman介绍 7.Postman之内置的动态参数和应用 8.接口关联 引言 接口测试工具如何选择?在我看来,Postman是一个非常值…

电商--红包活动总结

文章目录 背景表结构设计实现流程流程图流程解析流程优化 背景 这是一个来自于NFT电商项目,这是个营销策略的需求,为了快狠准,短期内刺激消费,拉动销售增加购买量。运营人员可以在平台创建红包,并且设置该红包的发放时…

Android系统视角下对APK的分析(1)- 静态分析APK文件

声明 以Android手机用户角度来看,安装各式各样的APP,基本就是从应用市场上 “搜索->下载->安装” 三连。而对Android系统来说,这就是个大工程了,因为对Android系统来说APK是“外来户”,如何安装它、有限制地支持…

【用户认证】密码加密,用户状态保存,cookie,session,token

相关概念 认证与授权 认证(authentication )是验证你的身份的过程,而授权(authorization)是验证你有权访问的过程 用户认证的逻辑 获取用户提交的用户名和密码根据用户名,查询数据库,获得完…

redis知识复习

redis知识复习 redis基础知识redis的认识一. 非关系型数据库 与 传统数据库 的区别二. 安装redis并设置自启动三. 熟悉命令行客户端四.熟悉图形化工具RDM redis的命令与数据结构一. 数据结构介绍二. redis通用命令(熟练掌握) redis的Java客户端一. Jedis…

文心一言 VS 讯飞星火 VS chatgpt (38)-- 算法导论5.4 2题

二、假设我们将球投入到b个箱子里,直到某个箱子中有两个球。每一次投掷都是独立的并且每个球落入任何箱子的机会均等。请问投球次数期望是多少? 文心一言: 这是一个典型的鸽巢原理(Pigeonhole Principle)问题。假设每次投球时&…

2023年上半年系统分析师下午真题及答案解析

试题一(25分) (试题一为必答题,试题二~五选答两题) 某软件公司拟开发一套汽车租赁系统,科学、安全和方便的管理租赁公司的各项业务,提高公司效率,提升利用率。注册用户在使用系统进行车辆预约时需执行以下操作:(a)用…

从0-1一起学习live555设计思想之二 RTSP交互过程

流媒体服务系列 文章目录 流媒体服务系列前言一、OPTION二、DESCRIBE三、SETUP四、PLAY总结前言 本篇文章通过代码去分析rtsp交互过程与工作原理。由于live555的继承关系太过复杂,所以做了个图简单记录一下与h264文件传输相关的类继承关系。 一、OPTION OPTION比较简单,就…

【调制BFSK】二进制频移键控FSK的数字调制(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

ARM学习(22)断点认识以及调试

笔者来聊聊断点以及断点的调试 1、断点原理 断电的原理一般分为两种,插入断点指令或者利用硬件调试寄存器进行断点。 前者程序如果在RAM(SRAM、DDR)上,则调试器可以直接在断点地址处插入断点指令,例如BKPT&#xff0…

python自动化测试-自动化基本技术原理

1 概述 在之前的文章里面提到过:做自动化的首要本领就是要会 透过现象看本质 ,落实到实际的IT工作中就是 透过界面看数据。 掌握上面的这样的本领可不是容易的事情,必须要有扎实的计算机理论基础,才能看到深层次的本质东西。 …

家用电器-空调制冷、制热、除霜、除湿、换新风的基本原理及实现讲解

目录 一、空调历史 二、空调的作用 三、空调类型 四、基本原理 4.1 制冷过程 4.2 制热过程 4.3 除霜过程 4.4 除湿过程 4.5 换气过程 五、电路控制系统 六、核心部件 七、基本指标 1)气候类型 2)额定制冷量 3)能效比 八、市场…

4年功能庸庸碌碌,进阶自动化测试拿到了24k,测试之路不再平凡...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 手工测试如何进阶…