【深入学习51单片机】一、基于8051的RTOS内核任务切换堆栈过程剖析

2023-05-16

我一直在写裸机,写的多了自然会对rtos产生浓厚兴趣,最有意思的莫过于任务切换了,可以在多个死循环里面跳转,很神奇的样子。本文学习参考程序是网上一个基于8051的简易os,从哪里下的已经忘了。。。(好像是51黑,但搜不到了,,,下载链接放在文章末尾)。我会将学习过程整理成【深入学习51单片机】专辑文章,后面不间断更新吧(鸽)。。。

原理: 任务切换是通过操作堆栈指针SP来完成的。只要在切换任务时保存当前任务堆栈,然后切换到目标任务堆栈就完成了任务切换。
程序指针PC的切换也是通过操作堆栈指针SP来完成(51单片机并不能直接操作PC程序指针),程序在进入子程序时PC会最先入栈,子程序返回时PC会最后出栈,这样操作PC对应的堆栈位置就间接的操作了PC程序指针。

下面是我写的一个简单的测试程序,单文件就可以编译。 程序实现了在task1()和task2()之间的循环切换,举一反三,如果用定时器中断写一个任务切换,再加上现场保存和恢复、优先级判断,即实现了一个丐版的RTOS多任务内核。
注释比较详细了,方便理解,仿真跟踪SP和PC的值变化就清楚了。

#include "reg51.h"
//调用普通函数无变量参数的话只需要入栈:PC指针两个字节
//调用中断函数的话还另外需要入栈工作寄存器,详情可写个中断程序,参考反汇编入栈出栈过程
unsigned char idata stack1[2];		//任务堆栈,因为这里只需要保存PC指针,所以只需要两个字节
unsigned char idata stack2[2];

void task1(void);
void task2(void);

void task1(void)
{
	((unsigned char idata*)stack2)[0] = (unsigned int)task2;    //修改压入的PC指针地址,先压低八位
	((unsigned char idata*)stack2)[1] = (unsigned int)task2>>8; //再压高八位,操作SP后SP才指向这里
																//程序返回后PC会由硬件指向这里
	
	SP = (unsigned char)&stack2[1]; //修改出栈时的堆栈指针,指向要弹出到PC指针的高八位位置
}

void task2(void)
{
	//PC自动压栈时,先压低8位地址,再压高八位地址
	//因此PC出栈时,先出高八位地址,再出低八位地址
	((unsigned char idata*)stack1)[0] = (unsigned int)task1;    //修改压入的PC指针地址,先压低八位
	((unsigned char idata*)stack1)[1] = (unsigned int)task1>>8; //再压高八位,操作SP后SP才指向这里
																//程序返回后PC会由硬件指向这里
	SP = (unsigned char)&stack1[1]; //修改出栈时的堆栈指针,指向要弹出到PC指针的高八位位置
}

void main(void)
{
	SP = 0x50; 		//堆栈位置初始化,可以不要,只是为了仿真时方便知道起始堆栈位置
	task1();
}

参考程序免积分下载链接,下一篇,讲解该参考程序。。。

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

【深入学习51单片机】一、基于8051的RTOS内核任务切换堆栈过程剖析 的相关文章

  • ubuntu vnc 下面小企鹅输入法 的安装及使用

    使用VNC View远程访问ubuntu xff0c 总是没有办法切换出小企鹅输入法的解决办法 安装Fcitx输入法 sudo apt get install fcitx 安装 im switch s fcitx 配置默认输入法为 fcit
  • java解析html之HTMLparser初次尝试

    为了爬取一个网页的数据 xff0c 尝试了一下Htmlparser来做小爬虫 下面是一个小案例 xff0c 用来爬取论坛的帖子内容 1 HtmlParser 简介 htmlparser是一个纯的java写的html解析的库 xff0c 主要
  • px4自定义mavlink收不到消息的问题

    px4版本1 12稳定版 最近在做px4二次开发相关工作 按照网上的一些教程自定义了一个mavlink消息用来控制无人机 按照教程里面的单独开了一个xml来定义消息 最后生成的消息在px4端通过流传输的方式自己写的客户端可以收到消息 但是客
  • windows WSL2 使用Xfce+dummy虚拟显示+VNC显示方案

    最近准备在自己的电脑 windows 下用wsl2装docker 然后将显卡共享给别人用 别骂了别骂了太穷啦太穷了 发现windows微软商店下载的ubuntu20 04子系统没有预装图形界面 想在wsl里面显示东西不好使用 摸索了一番 x
  • 有趣的docker镜像收藏

    docker一键安装脚本 wget qO get docker com sh 官方安装 curl sSL https get daocloud io docker sh 国内daodocker安装 推荐 镜像1 xff1a rastashe
  • vc 网络编程(socket)

    vc 网络编程 xff08 socket xff09 在网上找了很多的资料 xff0c 现将这些资料整合起来 xff0c 详细介绍一下VC下的socket编程 xff0c 并提供一个服务器客户端具体的实例 希望对您有所帮助 一 原理部分 个
  • ROS创建工作空间与功能包

    ROS学习笔记 学习古月居ros21讲笔记 第一章 ROS命令行工具的使用 第二章 创建工作空间与功能包 目录 ROS学习笔记 一 工作空间 二 功能包 一 工作空间 工作空间是存放ROS工程相关文件的文件夹 所有的源码 xff0c 编译文
  • C++类、结构对象内存布局浅析

    最近面试多 xff0c 出的题目很多都有如下形式 xff0c 给定一个class或者struct的定义 xff0c 例如这样 xff1a struct node int a char b int c char d 问题是 xff1a siz
  • 2014校园招聘总结

    本篇博文已迁移至吹水小镇reetsee com xff0c 迁移后地址为 xff1a http blog reetsee com archives 215 注 xff1a 貌似不少童鞋看到这篇东西觉得我是牛人 其实不是stO xff0c 以
  • 今天终于刷完leetcode的题了,同时分享一些资料

    如题了 持续了将近2个月的leetcode刷题之旅今天终于暂时告一段落了 xff08 以后肯定还会加题 xff09 记得我当初刷的时候只有134题 xff0c 现在就变成150题了 xff0c 可以说这些题都是基础 xff0c 但是却是十分
  • 路由器连接校园网并发WIFI:WR703N路由器安装OpenWRT并运行H3C客户端操作步骤(主要针对中山大学东校区)

    注意 xff1a 本文所有的最新更正请全部前往http blog reetsee com archives 227查看 本文主要目的在于让你的路由器能自动连接学校的校园网并且能发出WIFI让所有设备使用 要注意的是这篇作者呕心沥血写的超级傻
  • 教程:用OpenWRT进行WIFI接力——扩大WIFI覆盖范围

    因为准备去实习 xff0c 所以把宿舍很多东西都带回家了 xff0c 包括一个装了OpenWRT的路由器WR703N Step 0 为什么要这么做 在家里有一个地方不爽 xff0c 就是WIFI的信号覆盖不到我的房间 xff0c 所以我就想
  • 一个简单的开源PHP爬虫框架『Phpfetcher』

    这篇文章首发在吹水小镇 xff1a http blog reetsee com archives 366 要在手机或者电脑看到更好的图片或代码欢迎到博文原地址 也欢迎到博文原地址批评指正 转载请注明 xff1a 吹水小镇 reetsee c
  • 「更快!更爽!」吹水新闻2.0

    这篇文章首发在吹水小镇 xff1a http blog reetsee com archives 388 要在手机或者电脑看到更好的图片或代码欢迎到博文原地址 也欢迎到博文原地址批评指正 转载请注明 xff1a 吹水小镇 reetsee c
  • 如何对日志文件进行二分查找?开源文件二分查找工具『timecat』介绍

    这篇文章是我从自己的博客搬运过来的 转载请注明 xff1a 吹水小镇 reetsee com 原文链接地址 xff1a http blog reetsee com archives 502 要获得更好的阅读体验 xff0c 欢迎大家到这篇文
  • 阿里的电话面试是神马感觉

    感觉就是被问了个稀巴烂 xff0c 估计到不了下一轮 问了神马呢 xff0c 问了我的项目 xff0c 我描述了一阵子之后 xff0c 当他问到使用人数的时候 xff0c 我说是内部使用 没有发布 xff0c 只是一件比赛的作品的时候 xf
  • keil5 制作自己的pack

    转发自 xff1a http blog sina com cn s blog dc9571b90102vhqf html 以前都是用的keil5以下版本的keil xff0c 没有RTE这个功能 xff0c 后来安装了keil5以上的版本
  • 找出带环单向链表的环入口(交点)

    其实这个问题已经被问烂了 xff0c 但是之前没有想透 xff0c 今天算是解决得差不多 找环的入口这个问题 xff0c 其实是建立在另外一个问题之上的 判断单向链表是否有环 土方法很多 xff0c 但是比较好的目前就那么一个 xff1a
  • 关于我最近看的一本书——大名鼎鼎的APUE

    APUE xff0c Know as Unix环境高级编程 xff0c 我每天都在用自己的绳命去看 xff0c 每天都燃烧自己去看 什么样的书 xff0c 一看就是上乘之中的珍稀之品 xff1f 这本 不同于不少机械工业出版社的大部头 xf
  • 写博客加分不

    写第一篇博客 xff0c 就看看加分不 xff0c 这个网站分很重要 xff0c 不然下不了东西

随机推荐

  • 若在Ubantu中查询IP地址输入ifconfig时显示没找到该命令时怎么办?

    新手在学习Linux中想要查询IP地址输入ifconfig时却显示如下图 xff1a 这时我们只需要输入sudo apt install net tools 显示这下图时就证明已经安装好了 这时我们只需要 输入ifcogfig xff0c
  • 小觅相机深度版运行Vins-mono

    首先声明 xff0c 本人自己也是slam新手 xff0c 此贴只因为自己在用小觅相机深度版运行Vins的时候太过无助 xff0c 所以想写个自己运行出结果的完整过程 xff0c 仅供参考 xff0c 如有不对之处 xff0c 还望不吝指教
  • shell如何判定C/C++程序是否执行成功

    linux编程中经常遇到这样的问题 xff0c 即判断一个程序执行是否成功 xff0c 通常实现方法是通过进程的退出状态来判断 xff0c 当linux的一个进程执行完成后会返回一个进程的退出状态 xff0c 通过判断退出状态码 可以确定该
  • 删除数组中的指定元素或数组对象

    1 删除数组中的某个指定元素 1 xff09 首先获取元素下标 xff0c 用indexOf 函数找到他的位置index xff0c 如果没有找到这个元素那么index将会等于 1 xff1b 如下为找到元素2的下标 var array 6
  • stm32cubemx 配置FreeRTOS相关基础基础知识及串口接收中断实验

    本实验首先大家自身要有stm32cubemx基础配置 xff0c 比如GPIO 中断 串口 SPI等 xff0c FreeRTOS有相关的调用函数基础及调度任务的概念都需要提前理解 单独stm32cubemx或FreeRTOS网上很多 xf
  • select()

    select 简述 xff1a 确定一个或多个套接口的状态 xff0c 如需要则等待 include lt winsock h gt int PASCAL FAR select int nfds fd set FAR readfds fd
  • C#工控上位机开发

    对于电源软件开发者来说 xff0c 上位机的开发难度是远远小于下位机的 xff0c 之前几个月我一直在研究电力电子技术和下位机的控制算法 xff0c 也有了一点点的收获 xff0c 但说实话还是差的太远了 xff0c 而且人力物力资源非常稀
  • 虚拟机运行gazebo卡

    操作系统 xff1a ubuntu18 04 链接 B站链接 xff1a Autolabor初级教程 ROS机器人入门 问题 虚拟机gazebo卡的话 xff0c 可以试试在虚拟机设置里打开3d加速 xff0c 在每次启动gazebo前命令
  • 谨以此文献给才毕业一两年的朋友

    谨以此文献给才毕业一两年的朋友 选自同事信件 谨以此文献给才毕业一两年的朋友我们终于进入了这个社会 从此结束了被学校老师看管的生涯 xff0c 结束了做父母乖宝贝的日子 xff0c 也结束从父母兄长那里拿钱的幸福时光 我们从家里搬了出来 x
  • winform怎样设置comboBox默认值

    combox是开发winform常用的组件之一 xff0c 如何添加他的默认值呢 xff01 方法 步骤 新建一个windows窗体应用程序 xff0c 这里项目命名为test01 在默认打开的Form1中 xff0c 在左边的工具箱拖拉两
  • Internal server error 500 问题解决思路

    我们系统在一次升级之后 xff0c 生产环境大量出现Internal server error 500错误 xff0c 具体场景 xff1a 在APP上使用拍照功能后 xff0c APP通过Http协议上传压缩后的照片到服务端 xff0c
  • c# List集合类常用操作:二、增加

    所有操作基于以下类 class Employees public int Id get set public string Name get set public string City get set public DateTime Bi
  • 485通讯协议_终于有人把RS485通讯协议应用及缺点分析清楚了,看完收获多多

    RS 485是工业控制环境中常用的通信协议 xff0c 具有抗干扰能力强 传输距离长的特点 RS 485通信协议是对RS 232协议的改进 协议层不变 xff0c 但只有物理层得到了改进 xff0c 从而保留了串行通信协议应用简单的特点 R
  • 常用串口调试工具比较(详细)

    目前有许多免费的串口调试工具 xff0c 比较常用的有 xff1a 1 友善串口调试助手 xff08 v2 6 5 xff09 优点 xff1a 1 xff09 使用方便 xff0c 不丢包 xff1b 2 xff09 串口自动识别 xff
  • 请问在Delphi中用什么方式打开窗体能让它一直在最前面,而且还可以对其它窗体进行操作?

    将要打开的窗口FormStyle属性设置为 fsStayOnTop xff0c 然后再用show方法打开窗口
  • 微软Surface Pro 4/5平板如何重装Win10系统?教程分享

    重装Win10系统很多用户都会 xff0c 但是如果是平板 xff0c 那么操作起来和电脑可能会有不同 xff0c 毕竟平板需要触屏的支持 xff0c 今天我们要讲的是微软Surface Pro 4 5如何重装Win10系统 xff0c 主
  • C#发送16进制串口数据

    个困扰两天的问题 xff1a 需要通过串 向设备发送的数据 xff1a 0A010 7e 08 00 11 00 00 7e 76 7f 我先将每个16进制字符转换成10进制 xff0c 再将其转换成ASCII码对应的字符 lt summa
  • C# WinForm遍历窗体控件的3种方法

    这篇文章主要介绍了C WinForm遍历窗体控件的3种方法 xff0c 帮助大家更好的理解和使用c xff0c 感兴趣的朋友可以了解下 目录 1 循环遍历2 递归遍历3 使用反射 1 循环遍历 1 2 3 4 5 6 7 8 private
  • gazebo_ros:未找到命令

    操作系统 xff1a ubuntu18 04 链接 B站链接 xff1a Autolabor初级教程 ROS机器人入门 问题 gazebo ros xff1a 未找到命令 解决办法 sudo apt install ros span cla
  • 【深入学习51单片机】一、基于8051的RTOS内核任务切换堆栈过程剖析

    我一直在写裸机 xff0c 写的多了自然会对rtos产生浓厚兴趣 xff0c 最有意思的莫过于任务切换了 xff0c 可以在多个死循环里面跳转 xff0c 很神奇的样子 本文学习参考程序是网上一个基于8051的简易os xff0c 从哪里下