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

uc/os-II 原理及应用(八) 系统裁减以及移植到51单片机-下

现在说明几个重要的点,

  1. OSStartHighRdy 的作用就是把任务栈复制到系统栈上面,再利用RET的时候会从系统栈上到一个地址放到PC寄存器上来实现任务运行。
  2. OSCtxSw是任务切换,把系统栈全部备份到当前任务栈映射上,然后改OSTCBCur,调用OSStartHighRdy跳到新任务上来。
  3. OSIntCtxSw是在中断函数中来任务切换的
  4. 需要明确知道系统栈SP的初始值,也可以自己定义,参考C51定义SP初值
  5. OSIntCtxSw要明确清晰的知道系统栈中哪些内容需要丢弃。
  6. 要明确知道系统栈是如何工作的,像51单片机的栈是增长式的,压栈时是先加1,再存内容。出栈时是先取内容,再减1。
  7. 要明确知道51单片机call时,会先将下个执行的地址的低8位先压栈,高8位后压栈。

; void OSStartHighRdy(void)RSEG  ?PR?OSStartHighRdy?OS_CPU_A
OSStartHighRdy: clr EAmov DPTR, #OSTCBCur	; DPTR = &OSTCBCur;;  DPTR = OSTCBCurmovx A,@DPTR	    mov R0,AINC DPTRmovx A,@DPTRmov R1,AINC DPTRmovx A, @DPTRmov R2,Amov DPH, R1mov DPL, R2;;  OSTCBCur->OSTCBStkPtrmovx A,@DPTRmov R0,AINC DPTRmovx A, @DPTRmov R1,AINC DPTRmovx A, @DPTRmov R2,A;;  DPTR = OSTCBCur->OSTCBStkPtrmov DPH,R1mov DPL,R2 ;;  在这里任务栈第一个数据是栈长度movx A,@DPTRmov R7,A    ;  R7 = DPTR[0] = lenINC DPTR
taskstk_copyto_sysstk:    ; DPTR:taskptr,  R7:len	movx A,@DPTRpush ACCINC DPTRDJNZ R7, taskstk_copyto_sysstk; #if OS_TASK_SW_HOOK_EN > 0u
; 	OSTaskSwHook();  
; #endif;; 	OSRunning = OS_TRUE;MOV  	DPTR,#OSRunningMOV  	A,#01HMOVX 	@DPTR,A?C0003:popallSETB EARETI  	
; END OF OSStartHighRdy

; void OSIntCtxSw(void)RSEG  ?PR?OSIntCtxSw?OS_CPU_A
OSIntCtxSw:mov A,SPclr Csubb A,#17mov SP,ALJMP 	OSCtxSw
; END OF OSIntCtxSw

这里丢弃了栈后面的17个数据,其中栈顶两是调用OSIntCtxSw产生,再前面两个是调用OSIntExit产生,
再前面13个是进入tmr0_func时pushall保护现场产生。


; void OSCtxSw(void)RSEG  ?PR?OSCtxSw?OS_CPU_A
OSCtxSw:pushallmov A, #SysStackStartmov R6,Amov A,SPclr Csubb A,R6mov R7,A ;  R7 = SP - SysStackStart  ; system stack length at nowmov DPTR,#OSTCBCur   ; DPTR = &OSTCBCur;; 	*(&OSTCBCur)movx A, @DPTR        ; A = OSTCBCurmov R0, AINC DPTRmovx A, @DPTRmov R1, AINC DPTRmovx A, @DPTRmov R2, A;; DPTR = OSTCBCurmov DPH,R1mov DPL,R2;; 	 OSTCBCur->OSTCBStkPtrmovx A, @DPTRmov R0, AINC DPTRmovx A, @DPTRmov R1, AINC DPTRmovx A, @DPTRmov R2, A;;  DPTR = OSTCBCur->OSTCBStkPtrmov DPH,R1mov DPL,R2;; DPTR[0] = len = R7	mov A,R7movx @DPTR,Ainc DPTRmov R0,#SysStackStart    ;  这里是自己定义的栈初始位置
save_sysstack_to_taskstack:inc R0    ; 在这里51单片机的系统栈是先+1再存内容的mov	A,@R0movx @DPTR,Ainc DPTRDJNZ R7,save_sysstack_to_taskstack;; OSPrioCur = OSPrioHighRdymov DPTR,#OSPrioHighRdymovx A,@DPTRmov DPTR,#OSPrioCurmovx @DPTR,A
;; 	OSTCBCur = OSTCBHighRdy;MOV  	DPTR,#OSTCBHighRdyMOVX 	A,@DPTRMOV  	R1,AINC  	DPTRMOVX 	A,@DPTRMOV  	R2,AINC  	DPTRMOVX 	A,@DPTRMOV  	DPTR,#OSTCBCurXCH  	A,R1MOVX 	@DPTR,AINC  	DPTRMOV  	A,R2MOVX 	@DPTR,AINC  	DPTRMOV  	A,R1MOVX 	@DPTR,A;; SP = SysStackStartmov A,#SysStackStartmov SP,A
; 	OSStartHighRdy();LJMP 	OSStartHighRdy
; END OF OSCtxSw

相关文章:

uc/os-II 原理及应用(八) 系统裁减以及移植到51单片机-下

现在说明几个重要的点, OSStartHighRdy 的作用就是把任务栈复制到系统栈上面,再利用RET的时候会从系统栈上到一个地址放到PC寄存器上来实现任务运行。OSCtxSw是任务切换,把系统栈全部备份到当前任务栈映射上,然后改OSTCBCur,调用…...

职场沟通与行为

职场沟通与行为 引言 在职场上,你是否曾遇到过困惑的沟通?是否对同事的行为有过疑虑?这不仅是个别现象,而是我们这个时代工作文化中的普遍问题。许多职场的摩擦,来自沟通不畅或是行为不当。那么,如何才能…...

【tailscale 和 ssh】当服务器建立好节点,但通过客户端无法通过 ssh 连接

背景 当服务器建立好节点,一切显示正常但通过客户端无法通过 vs code 中的 ssh 连接到服务器 问题解决 因为服务器是重装过的,所以忘记在服务器上下载 ssh 了。。。安装完成并启动 SSH 服务后便可正常连接! sudo apt update sudo apt in…...

Spark 之 Aggregate

Aggregate 参考链接: https://github.com/PZXWHU/SparkSQL-Kernel-Profiling完整的聚合查询的关键字包括 group by、 cube、 grouping sets 和 rollup 4 种 。 分组语句 group by 后面可以是一个或多个分组表达式( groupingExpressions )。 聚合查询还支持 OLAP 场景下的多…...

【JSqlParser】Java使用JSqlParser解析SQL语句总结

简述 Java解析SQL语句有很多工具都可以做到,比如Mybatis、Druid、目前用来用去最全面的仍然是Jsqlparser,它是一个Github上的开源项目,JSqlParser是一个用于解析SQL语句的Java库,它可以帮助开发者分析和操作SQL语句的结构。无论是…...

Linux下的dev,sys和proc(TODO)

(TODO) 还有一个sysfs 在 Linux 系统中,/dev、/sys 和 /proc 是三个特殊的虚拟文件系统目录,它们各自有特定的用途,主要用于与设备和内核交互。以下是它们的详细区别和功能说明: 1. /dev(Devi…...

【Unity3D】利用Hinge Joint 2D组件制作绳索效果

目录 一、动态绳索 (可移动根节点) 二、静态绳索 三、利用Skinning Editor(Unity2022.3.15f1正常使用) 四、注意事项 一、动态绳索 (可移动根节点) 动态绳索 DynamicRope空物体 Anchor和whitecircle是相同位置的物体&#xff…...

Springer Nature——Applied Intelligence 投稿指南

投稿系统:Editorial Manager (Manuscript and Peer Review) : 使用Editorial Manager 投稿系统的期刊列表:期刊列表 期刊主页:Spring Nature 主页 投稿主页:Spring Nature Submit SystemSubmission Guidelines: Official Submissi…...

数据结构、数据类型、数字编码、字符编码:保姆级图文详解

文章目录 前言1、数据结构分类1.1、逻辑结构:线性与非线性1.2、物理结构:连续与分散1.3、数据结构的实现方式1.4、数据结构的选择依据 2、基本数据类型2.1、定义与分类2.2、存储形式 3、数字编码3.1、原码、反码与补码3.2、浮点数编码3.3、整数与浮点数区…...

DM适配连接kettle迁移工具(资源库+数据源配置)

适配改造介绍及说明 本次修改基于8.2.0.0版本调整,在该源码基础上进行DM的适配,已支持DM为资源库的配置以及相关数据迁移。kettle资源库是Kettle ETL工具内置的一个资源库。配置好的数据库可以直接缓存到资源库当中;创建、编辑好的转换/作业…...

WINFORM - DevExpress -> alertControl1提示信息框

第一个按钮为常规按钮, 单击触发 ButtonClick 事件. 第二个按钮有选中和未选中状态. 单击触发 ButtonDownChanged 事件。 if (e.ButtonName "alertButton2") { } 在dev用户界面中进行提示(usecontrolwinform) AlertInfo info new AlertInfo("提示",…...

STM32-串口-UART-Asynchronous

一,发送数据 #include "stdio.h" uint8_t hello[]"Hello,blocking\r\n"; HAL_UART_Transmit(&huart1,hello,sizeof(hello),500); 二,MicroLIB-printf(" hello\r\n") #include "stdio.h" #ifdef __GNUC…...

Nginx三种不同类型的虚拟主机(基于域名、IP 和端口)

🏡作者主页:点击! Nginx-从零开始的服务器之旅专栏:点击! 🐧Linux高级管理防护和群集专栏:点击! ⏰️创作时间:2025年1月15日13点14分 目录 1. 基于域名的虚拟主机 …...

Shell控监Kafka积压

1、获取Kafka消息堆积情况 vi check-kafka-lag.sh #!/bin/bashTOPIC"total_random" GROUP_ID"etl-dw" BOOTSTRAP_SERVER"node-01:9092,node-02:9092,node-03:9092"# 检查第一个参数是否为数字 if ! [[ $1 ~ ^[0-9]$ ]]; thenecho &…...

element-ui textarea备注 textarea 多行输入框

发现用这个组件,为了给用户更好的体验,要加下属性 1. 通过设置 autosize 属性可以使得文本域的高度能够根据文本内容自动进行调整,并且 autosize 还可以设定为一个对象,指定最小行数和最大行数。:autosize"{ minRows: 3, ma…...

Transformer创新模型!Transformer+BO-SVR多变量回归预测,添加气泡图、散点密度图(Matlab)

Transformer创新模型!TransformerBO-SVR多变量回归预测,添加气泡图、散点密度图(Matlab) 目录 Transformer创新模型!TransformerBO-SVR多变量回归预测,添加气泡图、散点密度图(Matlab&#xff0…...

大疆机场及无人机上云

最近基于大疆上云api进行二次开发,后面将按照开发步骤对其进行说明!...

用Cursor生成一个企业官网前端页面(生成腾讯、阿里官网静态页面)

用Cursor生成一个企业官网前端页面 第一版&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...

Java 数组排序

目录 1.Java冒泡排序&#xff08;Bubble Sort&#xff09; 1.冒泡排序 2.冒泡排序的算法原理 3.冒泡排序的复杂度和性能 4.形成代码 2.Java快速排序&#xff08;Quick Sort&#xff09; 3.Java归并排序&#xff08;Merge Sort&#xff09; 4.Java选择排序&#xff08;S…...

LeetCode:78.子集

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;78.子集 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xf…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...