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

ucos运行linux文件,关于移植ucosii到windows和linux平台下的思路

最近给学生上ucosii,因为课本上是在dos下运行ucosii,我不知道怎么的,对此一点兴趣没有,总觉得dos古老的东西了,再没兴趣去玩它。但是学校条件很差,没有开发板来实际玩ucosii,因此光看代码效果比较差。于是我原先想在linux下运行ucosii,后来又想既然linux下可以做,那么windows下也就同样可以。

受原书作者的影响,我开始是打算采用和dos下相同的办法移植,即修改中断描述符表IDT,把时钟节拍中断isr改成自己的,这个isr就是ucosii需要的那个时钟节拍产生器,当然调用完自定义的IRQ0 isr后再去调用linux/windows的IRQ0 isr。不过昨天仔细一想觉得这个办法很困难,修改IDT需要写个驱动完成,更重要的是任务切换这块的代码很难实现,用个 软件中断INT x了模拟?可是为了能直接操作寄存器可能必须在内核模式下完成,包括时钟的 isr更是必须在内核模式下运行,内核模式下回调ucosii的OTimeTick等 函数将非常复杂,毕竟ucosii要运行在用户模式下。最后觉得最主要的问题是无法再内核模式程序与ucosii之间通信,共享许多全局变量,比如就绪表那些数据结构。

昨天夜里想到3点多,想到可以完全用软件模拟个虚拟的硬件环境来运行ucosii。我的思路如下(以windows为例,linux是完全类似的)

1. 首先用个软件定时器(win32 API中的timer)实现模拟时钟节拍中断。定时器到期时候会触发个事件(最好可能还是用win32的那种可等待的定时器),专门创建个线程等待这个定时器事件,这个线程就相当于模拟了ucosii里面需要的那个时钟节拍isr。该线程一旦等到定时器事件,则执行OSTimeTick,这样就模拟了时钟节拍

2.每个任务用一个windows线程模拟,在调用OSTaskCreate创建一个任务的时候,需要调用OSTaskStkInit函数初始化堆栈,这个函数是移植过程需要实现的,我的想法就是实现这个函数,在这个函数里面CreateThread创建个线程,这个线程就运行该任务的代码。线程创建的时候指定不运行,而是在挂起状态

3.整个ucosii当作一个windows进程,里面各个任务是该进程的线程,为模拟任务调度,可以设置个全局的数组变量OSThreadHandle[63],改数组保存与每个任务对应的线程句柄,且位置与任务的优先级对应,比如优先级为0的任务对应的线程句柄放在OSThreadHandle[0]中。

4.任务调度过程这样模拟:OSSched()函数(不需要修改它)根据优先级找到就绪的最高优先级,放在OSPrioHighRdy中,然后唤醒一个专门用于调度的线程,该线程通过这个OSPrioHighRdy在OSThreadHandle中找到对应的线程句柄,如果需要切换,则挂起当前线程,唤醒OSPrioHighRdy对应的那个线程,模拟了任务调度过程。

win32 api中的ResumeThread,SuspendThread正好干这些事情

5.OSINTEnter和OSINTExit的模拟:这个只要停止定时器就能实现

6.任务删除也很好模拟,写个OSTaskDelHook,在这个函数里调用api函数TerminateThread然后closehandle就可以把任务对应的线程干掉,从而达到删除任务的要求

这样ucosii将完全是个windows下的用户模式的进程,大体想了这么多,觉得应该可以实现。但是最近事情多,不一定有工夫做。这个包括linux版本的实现还是有意思的,可以学到不少东西。

相关文章:

  • linux strace 跟踪线程,获取线程id--strace跟踪线程系统调用
  • linux 非root进程,Linux查看非root运行的进程
  • linux下多路径dm不一致,DM多路径存储
  • linux虚拟主机管理平台,8 款顶级的虚拟主机管理系统
  • linux安装无线电软件,Uhd+GNUradio软件无线电平台在Linux系统上安装过程
  • linux主机健康检查,Zabbix监控Tengine 后端服务器健康检查
  • linux邮件查收,Linux mail命令:发送和接收电子邮件
  • 空间坐标转屏幕坐标c语言算法,线性代数——坐标系空间转换
  • openmv4可以c语言开发吗,OpenMV4开发笔记1-感光元件初始化
  • 西安邮电大学c语言期末考试题,西安邮电大学操作系统期末试卷(含答案)
  • android 本地文件读写,Android 读写文件方法汇总
  • android h 游戏下载地址,Android h游戏_如何在Android手机上玩游戏
  • android+捕获google账户+cancel按钮,MVVM: 这是一个android MVVM 框架,基于谷歌dataBinding技术实现...
  • android:stretchcolumns=0,1,2,3,android:stretchColumns用法
  • 鸿蒙os荣耀hdc大会,华为HDC2020开发者大会官宣,EMUI 11、鸿蒙OS 2.0将亮相
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【刷算法】求1+2+3+...+n
  • android图片蒙层
  • angular学习第一篇-----环境搭建
  • flask接收请求并推入栈
  • in typeof instanceof ===这些运算符有什么作用
  • JAVA SE 6 GC调优笔记
  • Java 多线程编程之:notify 和 wait 用法
  • Linux gpio口使用方法
  • mysql外键的使用
  • 阿里云Kubernetes容器服务上体验Knative
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 当SetTimeout遇到了字符串
  • 观察者模式实现非直接耦合
  • 欢迎参加第二届中国游戏开发者大会
  • 解析 Webpack中import、require、按需加载的执行过程
  • 聊聊hikari连接池的leakDetectionThreshold
  • 免费小说阅读小程序
  • 我从编程教室毕业
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​Spring Boot 分片上传文件
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (1)(1.13) SiK无线电高级配置(五)
  • (1)bark-ml
  • (13)Hive调优——动态分区导致的小文件问题
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)jdk与jre的区别
  • (转)ORM
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .net 反编译_.net反编译的相关问题