linux与freertos区别,谈谈uCOS和freeRTOS这两种实时系统的结构以及编程思想

2023-05-16

距离上次总结,已经过去有差不多半年了,最近又到了自己半年一次的总结了。首先说说自己的编程风格的变化,在上一篇(第三篇文)中提到的数据结构、配置文件结构、预编译结构,目前已经逐渐适应,也在逐步加深应用。可以说是这半年的一点小变化吧。

在这中间呢,又跑去折腾了uCOSII和freeRTOS,uCGUI,C#,Linux,ARM9等乱七八糟的东西;现在呢,还是安心的继续搞搞STM32和C语言吧,在飞之前,还是要经历走和跑的过程的。

今天在这里说说我对uCOS和freeRTOS的一点小理解吧。只是针对这两种实时系统的结构和编程思想,不牵扯准确的应用。主要是对新手学习之前有一个结构上的理解。然后呢,本人在嵌入式实时操作系统方面也是一个很老的菜鸟而已,有什么遗漏和不对的地方还希望大家能多多包涵。

441fc29f5f81a1f8f55af88adc019f0d.png

正文时间到,学习了那么久实时操作系统,对于操作系统的结构认识也是很模糊的;而去阅读源码吧!是一个很痛苦且工作量很大的事情,本人也是折腾N久,终于有一次(也就是在折腾ARM9时的意外收获)发现一片优秀文章,完后才把实时操作系统基本的结构组织了起来。想想对新手是有很大的帮助,也就来写出来。在这里再次强调一句老掉牙的话:要会一点汇编、了解单片机运行原理和对C有较好的理解。

其次呢!单片机它只有一个CPU(排除那个什么双核的单片机,其实我也不太明白它),也就是说它一个时刻点只能做一个事情,就像让你同时照顾10个婴儿一样,你也只能是先哄哄这个,再去哄哄那个。单片机的多任务也是一样的原理。

0760b043bc5e306c4cffa6417f2014c4.png

首先说说一般的、最简单的单片机程序:

void main(void)

{

XXX_Init()

while(1)

{

xxx();

xxx();

......

}

}

好了,我刚开始学51的时候,也是这么写的,其实大家都是这么写的。当然这个还没有包括中断。如果加上中断呢?其实能琢磨RTOS的我想基本都会用中断了吧!但是能理解本质的不一定是全部。我还是画结构吧。

void main(void)

{

XXX_Init()

interrupt_init();

while(1)

{

xxx();

----------------------->假设中断发生在这里,那么单片机就要掉头了,去执行中断了-------->

我胡汉三又回来了

xxx();

......

}

}

好了,大概就这么个样;其实当时我在想,估计多任务操作系统就是根据硬件中断原理写的吧!

记住硬件中断的准确步骤,有用的。我尽可能的写的通俗一点。

单片机在运行的时候,用到的几个核心的寄存器(写过汇编的人明白)就是PC、累加器和几个CPU的Rx寄存器、在C语言中还有SP(架构不同,细节不同,基本一样)。在正常运行时,用到了这几个寄存器,我叫它们公用寄存器;那么中断发生时,是要进中断函数的,在中断函数里面也是要进行各种运算的,也会用到那几个公用寄存器,怎么办呢?这个时候,用到了C语言里面的那个栈,把那些东西先暂时保存到栈里面(入栈)(结构不一样,栈的理解也不一样,不细说);在中断服务函数里面,就可以把那些公用寄存器值覆盖掉,而去填入新的值。在中断函数执行完毕后,再把那些数填回到那些公用寄存器(出栈),这样就可以实现while(1)主线程和中断辅助线程的双任务了,多个中断也可以排列成优先级不一样的多任务。

而实时操作系统呢,就是类似于用软件来产生单片机硬件那样的中断,而且那中断是可控制的。单片机的运行,实际就是PC指引着CPU去哪儿执行命令,CPU用RX和累加器来就运算中间缓冲。操作系统实际就是用软件控制了PC的值,而不是那种单纯的靠着PC指针自加去顺序的执行命令。

说到这儿,通俗的原理性的东西好像写完了,剩下的就是软件上面的猛料了。现在回想起来,觉得那些结构和思路写的太完美了。明天再给大家分享,软件上实现任务转移的步骤及分析。

点击下方“阅读原文”查看更多

↓↓↓

长按关注嵌入式ARM

长按关注21ic官方微信

长按关注电源FAN

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux与freertos区别,谈谈uCOS和freeRTOS这两种实时系统的结构以及编程思想 的相关文章

  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • 在 Linux 上更快地分叉大型进程?

    在现代 Linux 上达到与 Linux 相同效果的最快 最好的方法是什么 fork execve combo 从一个大的过程 我的问题是进程分叉大约 500MByte 大 并且一个简单的基准测试只能从进程中实现约 50 个分叉 秒 比较最
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 如何通过替换为空页映射来取消映射 mmap 文件

    Linux 用户空间有没有办法用空页面 映射自 dev null 或者可能是一个空页面 重复映射到从文件映射的页面的顶部 对于上下文 我想找到这个 JDK bug 的修复 https bugs openjdk java net browse
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 如何在Linux内核源代码中打印IP地址或MAC地址

    我必须通过修改 Linux 内核源代码来稍微改变 TCP 拥塞控制算法 但为了检查结果是否正确 我需要记录 MAC 或 IP 地址信息 我使用 PRINTK 函数来打印内核消息 但我感觉很难打印出主机的MAC IP地址 printk pM
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • Linux:在文件保存时触发 Shell 命令

    我想在修改文件时自动触发 shell 命令 我认为这可以通过注册 inotify 挂钩并调用来在代码中完成system 但是是否有更高级别的 bash 命令可以完成此任务 尝试 inotify 工具 我在复制链接时遇到问题 抱歉 但 Git
  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec

随机推荐