关于uc/os-ii在c51上的移植总结
关于uc/os-ii在c51上的移植总结
难以避免会出现理解错误 欢迎指正。
现在我手上的参考书是很薄很薄的用x86作为实验的参考书,提供了不太完整的c51移植代码,移植主要需要修改的底层抽象层文件大致是一下四个:
- OS_CPU_A.ASM(最重要的一个文件)
- OS_CPU_C.H
- OS_CPU_C.C
- OS_CFG.H(该文件用于系统剪裁等)
uc/os-ii底层需要实现的大致接口如下:
OS_CPU_A.ASM
- OSStartHighRdy()
- OSCtxSw()
- OSIntCtxSw()
- OSTickISR()
OS_CPU_C.C
- OSTaskStkInit()
- OSTaskCreateHook()
- OSTaskDelHook()
- OSTaskSwHook()
- OSTaskStatHook()
- OSTimeTickHook()
这里的六个函数中也就只有OSTaskStkInit需要改写,另外的五个函数只要声明即可。
移植会遇到许多问题
将一个操作系统移植到不同的硬件环境中,需要修改操作系统硬件抽象层来适应不同的实际环境,这里不仅是与硬件相同,与编译器也息息相关。在不同的硬件环境以及不同的编译器面前可能都会采用不同的策略来实现或者提高效率。这里我用的是C51 STC89C51 以及Keil51编译器,而因为C51的片内内存非常少,所以对于函数而言默认是不可重入的,如果需要重入就需要添加关键字reentrant。
关于可重入函数以及堆栈(系统堆栈以及模拟堆栈)的关系
如果有两个函数void A(){ int a =0;[输出a]} void B(){int b=0;[输出b]}
默认这两个函数是不可重入的,那么他们的数据段中的临时变量将会定位在一个可以被覆盖的段中,此时如果发生中断,这个段可能被覆盖,如果A函数在执行到输出a的那个部分的代码段被中断转而运行B函数时,如果恰好a所在的存储位置被覆盖,在执行完B回去执行A的时候,A的结果就非常有可能出错。这是不希望出现的结果。那么就应该将函数声明为可重入的函数。
这个时候在KEIL里的STARTUP文件中声明的全局指针变量?C_XBP指向的便是模拟堆栈(这个堆栈存储在片外内存,以改善51单片机片内内存小的特点)的栈顶地址,也依赖这个编译器的特点来实现移植。
c51中的堆栈
系统堆栈与模拟堆栈。
- 系统堆栈:在片内的data区。由sp指向栈顶,上电初始化为07H。在通用寄存器后一位开始。通过指令PUSH与POP进行操作。
- 模拟堆栈:与名字相符就是模拟出来的堆栈,在响应中断的时候可以将内容保存下来,这样在操作的时候不会使函数返回继续运行的时候出错。存储在片外的xdata区,在STARTUP文件中声名了全局变量?C_XBP来指向这个区域。所以在进行任务切换的时候除了保存sp还要保存与恢复这个变量。这个变量就是对应每个变量的TCB结构体的堆栈栈顶指针变量。操作的方式是通过mov,movx等指令来进行片外与片内数据域的交换。
。。未完待续
移植过程中遇到的困难 主要是对汇编的不熟悉
于是在复习完51的汇编后,一切感觉都能迎刃而解。
Note:
临界段的本质作用:
- 保护互斥变量
- 实现 函数的可重入性:在临界段里的代码 不会被中断打断,就会使得这个函数可被重入。
· 普通任务与中断任务的不同:
中断任务会使用OSIntEnter()与 OSIntExit
而在OSIntExit中会使OSIntNesting-=1;然后检查OSIntNesting与OSLockNesting确定目前是否可以进行任务调度。也就是说中断任务本身会更快完成,因为OSIntNesting不为0的时候不会进行新的任务调度,肯定会先完成中断的任务。而OSTickISR函数会一直调用OSIntEnter与OSIntExit来调度最新的优先度最高的函数,当然 在符合以上条件时。
关于uc/os-ii在c51上的移植总结相关推荐
- Lab 6:uC/OS II
为什么80%的码农都做不了架构师?>>> 目标: 移植uC/OS II到RPi上,实现两个任务的调度.这两个任务能轮流点亮LED,并通过串口发送消息表明自己正在运行 具体步骤: ...
- UART0串口编程(四):UART0串口编程之在UC/OS—II中遭遇的危机
UART0串口编程之在UC/OS-II中遭遇的危机 一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来 ...
- uc/OS II——多任务设计
uc/OS II--多任务设计 (1)设计 开始任务 [1]/声明 开始任务 任务块 static OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE]; ...
- linux串口互斥,UART0串口编程之在UC/OS—II中遭遇的危机
一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来接收数据. 2.在进行串行通信时,双方遵循相同的通信 ...
- uC/OS 的进程调度(上)
操作系统最重要的任务之一就是进程调度,它涉及三个主要方面: 何时进行调度 如何选择下一个活动进程 如何实现进程切换 每种操作系统差别很大,本文对uC/OS的进程调度机制进行一些细致分析. 何时进行调度 ...
- uC/GUI 在Cortex-M3 内核上的移植
屈环宇--嘉兴学院 一.简介 是一种专为嵌入式系统设计的图形界面支持系统.它的代码全部由标准C 编写,模块化的设计,具有很强的可移植性.uC/GUI 适应大多数的黑白或 彩色LCD 的应用,还提供一个 ...
- 【 uC/OS II 】uC/OS II 源代码阅读(os_task.c)任务管理
前言 这个任务管理源代码,是整个系统最核心的部分,也是最难的部分,多看几遍吧.其中的核心结构体是: typedef struct os_tcb {OS_STK *OSTCBStkPtr; /* Poi ...
- uc os ii与linux,uC/OS-II嵌入式实时操作系统的几大特点
uC/OS-II嵌入式实时操作系统的几大特点 出处:网络 发布于:2018-09-12 14:46:03 uC/OS-II的特点 1.uC/OS-II是由Labrosse先生编写的一个开放式内核,主要 ...
- 【 uC/OS II 】uC/OS II 源代码阅读(os_mbox.c)消息邮箱
前言 关于消息邮箱,是一个消息邮箱里面,只能存储一条消息.核心结构体如下: #if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0u) typedef s ...
- 【嵌入式系统—实时操作系统】uC/OS II源码的官网下载
要下载源码为:STM32F107-uC/OS-II源码包 Micrium官网的下载地址:Micrium_uC-Eval-STM32F107_uCOS-II 怎么找? 到官网的产品专区目录入口查找STM ...
最新文章
- Hinton 新作!越大的自监督模型,半监督学习需要的标签越少
- R语言使用fs包的dir_create函数在指定路径下创建新的文件夹、使用file_create函数在指定文件夹下创建文件
- 一篇关于java变量定义的文章
- Android编译32或64位程序
- jq防止冲突,后退链式,队列操作
- MMJ-Spring Boot(Java)获取小程序Openid
- 折线图表android,Android 折线图表MPAndroidChart的实现
- LeetCode 909. 蛇梯棋(BFS)
- windows oracle 内存大,如何设计Oracle数据库内存的大小
- oracle系统实验,实验1 启动Oracle系统
- springboot test_精益求精!Spring Boot 知识点全面回顾,带你重新细读源码!
- 对计算机上的浏览器的介绍,挖掘IE浏览器的潜在功能(一) -电脑资料
- Halcon PDF文档(hdevelop_users_guide)学习总结之一
- Ubuntu在docker容器中安装TensorFlow-1.5
- C#通过LPT控制打印机——txt文档读取指令打印条码
- GeoLite2-City.mmdb 下载方法
- 拉丁超立方体抽样方法学习笔记
- 电脑系统坏了怎么修复
- OCR识别--详解驾驶证识别技术
- 【ug903】Xilinx XDC约束的序(Order)