关于ucos在lpc上移植
关于ucos在lpc上移植:
主要有四个文件,传统的有三个文件:os_cpu_c.c,os_cpu_a.s,os_cpu.h
还有一个是IRQ.inc
Os_cpu.h:这个文件相对来说还是很简单的,关于变量的重新定义,堆栈生长度,临界区了,最有特色的是运用swi软中断。
Os_task_sw()肯定是用软中断了,在mdk中要声明一个没有定义的函数,就要在这个函数前面加上__SWI(),也就是用它声明,而__swi()就是一个关键字了。uc在x86上移植也是用的软中断int 0x80。在lpc中一旦调用os_task_sw()就会触发__swi(0x00)这个软中断,那它就会使arm进入管理模式然后执行软中断函数SoftwareInterrupt,这个函数在os_cpu_a.s中定义,后续。
关于os_task_sw() osstartHighRdy() 进入临界区的两个函数 还有一些ARM用到的函数 它们为什么要用软中断而不用普通函数调用呢?答案是这样的:ARM处理核有两个指令集,用户任务还可以使用两种模式:用户和系统,组合起来就有4种方式了,各种方式对系统资源有不同的访问控制权限。为了使底层接口函数与处理器状态无关,同时在任务调用相应的函数时不需要知道函数位置,也就是说:统一进入管理模式,统一用软中断调用。
Os_cpu_a.s:这个文件主要当然是SoftwareInterrupt了,在这个函数里有三方面跳转:
1.os_task_sw 2.osstartHighRdy 3. SWI_Exception
1.一个任务切换也调用OSIntCtxSw这个标号,说明它和中断切换过程一样,都是先保存老的再迎取新的,但是有一点不同:就是这两个函数调用的模式不同:任务级切换是进入管理模式而中断级是进入IRQ模式。妙就妙在虽然是进入的不同模式但一进来都是在SP指针下取老任务的数据然后保存,然后迎新。可以看出这时的SP指针一个是管理的一种情况是IRQ的。Spsr记录了任务的环境,而不管什么模式都用R3来记录spsr,然后保存,总之陈明计写得太效率和有技巧了。
2.osstartHighRdy 其实就是调用OSIntCtxSw_1,就不多说了它就是迎新呗
3.这个函数在.c文件里,后续。
Os_cpu_c.c:文件有一个OSTaskStkInit函数就很明显了,按照堆栈格式模拟,就不多说了。
SWI_Exception这个函数有好几路转向,去除了第一和第二路,因为在os_cpu_a.s中定义了。
临界区函数其实就是进去把中断位关闭就行了。但是还有一个陈添上去的一个全局变量OsEnterSum:主要来实现临界区嵌套,当OsEnterSum = 0的时候才开中断。
剩下的函数也是改变cpsr就完了没什么。
主要是在调用完SWI_Exception这个函数后还得回SoftwareInterrupt里面实现
任务的继续运行
关于函数的参数问题两个参数一个放到R0一个放到R1中传过来,呵呵。
IRQ.inc: 这个文件是汇编头文件里面定义了一个宏,在不少应用里直接把它复制到IRQ.S中了,然后在写上
;/*中断*/
IRQ_Handler HANDLER IRQ_Exception
;/*定时器0中断*/
Timer0_Handler HANDLER Timer0_Exception
这就是对这个宏的运用,分别套用就行了,它实现了os 对IRQ的管理。
在这个宏里面调用了两个函数:一个是IRQ_Exception_Function,一个是OSIntExit。第一个可以是Timer0_Exception在它里面调用timetick(),第二个调用OSIntExit(),在这个函数里调用osIntctxSw(),但是在includes.h中#define OSIntCtxSw() return,把这个函数给费了,呵呵,直接返回啦。然后在
宏里判断是否执行中断级切换。但是我就不明白陈为什么这样做了。
也可以还用os的osIntctxSw()调用啊,如果回来了说明不切换,然后直接恢复现场也行吧。切换就调用osIntctxSw呗。
关于ucos在lpc上移植相关推荐
- UCOS在LPC上的移植
一.一.OS_CPU_A.ASM文件的编写 1. 1. SoftwareInterrupt的编写 当发生软件中断时,程序通过异常向量表跳转到软中断的汇编与C接口程序SoftwareInter ...
- 实时操作系统UCOS学习笔记5----UCOSIII移植
在2009年Micrium公司推出了UCOSIII,相对于UCOSII性能有了进一步的提升,支持时间片轮转调度,极短的关中断事件等.本章讲解如何在STM32F103开发板上移植UCOSIII操作系统. ...
- 在android上移植ios
2019独角兽企业重金招聘Python工程师标准>>> Android与IOS是最受人们欢迎的两大移动平台,Android与IOS之争是一个永久的话题.接下来笔者就结合自己的知识和网 ...
- OpenCV在G-API上移植各向异性图像分割
OpenCV在G-API上移植各向异性图像分割 在G-API上移植各向异性图像分割 介绍 快速入门:使用OpenCV后端 检查calcGST() 运行G-API图 G-API初始版本:完整列表 检查初 ...
- ucos-ii在ARM7上移植
随着嵌入式技术的快速发展,实时多任务操作系统作为一种软件平台已逐步成为国际嵌入式系统的主流,目前世界上已经有一大批成熟的实时嵌入式操作系统,通常,对嵌入式软件的基本要求是体积小.指令速度快.具有较好的 ...
- STM32F407+CubeMX+Keil上移植RTX5实时系统
文章目录 一.前言 二.CubeMX 2.1.RCC 与 Clock Configuration 2.2.SYS 2.3.GPIO 2.4.Project Manager 三.Keil 3.1.Tar ...
- stm32移植paho_如何在STM32上移植Linux?超详细的实操经验分享
原标题:如何在STM32上移植Linux?超详细的实操经验分享 刚从硬件跳槽为嵌软时,没有任何一丝的准备.一入职,领导就交代了一项特难的任务--在stm32上移植linux! 瞬间我就懵了,没办法硬着 ...
- 在Tricore上移植μC/OS-III——0.1总述
本文是<在Tricore上移植μC/OS-III>专栏文章的第一篇,先简单介绍下整个项目. Tricore是英飞凌旗下的一款单片机内核,目前汽车电子领域常用的TC2XX和TC3XX等系列的 ...
- 华为EC122在HiSi3110E上移植
一.环境 1. 开发板内核:linux kernel 2.6.14 2. 3G卡片:华为EC122 二.相关工具 1. usb-modeswitch-1.0.2.tar.bz2 Usb_mode ...
最新文章
- 多伦多到温莎_我想要freeCodeCamp Toronto的Twitter来发布报价,所以我做了一个免费的bot来做到这一点。...
- php蜘蛛池搭建教程,【小旋风教程】万能蜘蛛池x4安装教程 _ 惠州SEO
- C++中的函数指针和函数对象总结
- 计算机视觉基础-图像处理(图像滤波)cpp+python
- Lotus Domino服务器及其应用系统的高级管理(2)
- python读取图片路径f.read()转化为bytes类型
- python打包exe与反编译exe文件与防止反编译方式生成exe
- PostgreSQL数据库常用SQL语句
- VS Code 创建HTML页面教程
- 区块链入门(一)------ 区块链简介(持续更新)
- 【读书】卡勒德·胡赛尼《群山回唱》 摘录
- Facebook 全面禁止口罩广告,各平台如何打击哄抬、售假
- 启动redis失败 Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功
- Java斐波那契数列
- 网络爬虫(python项目)
- 报错解决:urllib3.exceptions.MaxRetryError
- mysql如何导入生僻字_MySQL插入生僻字失败的处理方法(图)
- B2B从销售到深度协作
- 动漫人物人体结构难学么?衣物怎么画?
- 广州数控广数cnc数据采集入门一
热门文章
- 我眼中的OpenTracing
- 104道 CSS 面试题
- bilibiliclass76-80_C语言_程序的编译(预处理操作)+链接
- 传奇服务器端武器特效怎么修改,辐射4 装备效果自定义修改教程 怎么给装备添加特效...
- Modbus Tcp协议详解
- 西门子s7-400闭环控制模块_西门子S7-1200plc怎么样?具体功能如何?
- 岁月神偷啊时光杀手啊
- 自动化设计的人为因素模型中的自动化等级
- android NFC读写卡Demo
- Physica A 2020 | 链接预测综述(二)