启动ucosii之三PC_VectSet(uCOS,OSCtxSw)

C/C++的零散知识(三) 首先是关于dos,h头文件,在汇编语言课程设计用到了这个头文件,主要用到的函数为,FP_SEG和FP_OFF函数。 首先是关于FP_SEG函数,它一种数学函数,功 能是获取远地址段值。可惜的是我用vc6.0,以及vs2013编译器都显示有dos.h头文件但是没有FP_SEG函数,我用vs2013打开了vc6.0和vs2013的dos.h头文件,发现其中并没有进行FP_SEG的定义,这样会导致vc6... 阅读详情

原型来自PC.C

PC_VectSet(uCOS,OSCtxSw);
//vect向量号,一个内部中断(软中断)向量号
//参数2-中断处理函数.即中断号为0x80的中断处理函数
void PC_VectSet (INT8U vect, void (*isr)(void))
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif   
    INT16U    *pvect;
       
    pvect    = (INT16U *)MK_FP(0x0000, vect * 4);     /* Point into IVT at desired vector location     */
    OS_ENTER_CRITICAL();
/*
函数名: FP_OFF
功  能: 获取远地址偏移量
用  法: unsigned FP_OFF(void far *farptr);
函数位置: dos.h
*/
    *pvect++ = (INT16U)FP_OFF(isr);                   /* Store ISR offset                              */
/*
函数名: FP_SEG
功  能: 获取远地址段值
用  法: unsigned FP_SEG(void far *farptr);
函数位置: dos.h
*/
    *pvect   = (INT16U)FP_SEG(isr);                   /* Store ISR segment                             */
    OS_EXIT_CRITICAL();
}

奋斗

ucosii的任务切换是在中断中完成的,一个软中断,,不同于硬件中断.那么应用程序就应该在创建任务和调用系统函数OSStart()启动ucosii之前,
向系统的中断向量表安装任务切换函数OSCtxSw()的中断向量.
;OSCtxSw()是一个任务级的任务切换函数(在任务中调用,区别于在中断程序中调用的OSIntCtxSw()).
;在80x86系统上,它通过执行一条软中断的指令0x80H来实现任务切换.软中断向量指向OSCtxSw().
;在uC/OS-II中,如果任务调用了某个函数,而该函数的执行结果可能造成系统任务重新调度(例如试图唤醒了一个优先级更高的任务),则在函数的末尾会调用OSSched(),如果OSSched()判断需要进行任务调度,会找到该任务控制块OS_TCB的地址,并将该地址拷贝到OSTCBHighRdy,
;然后通过宏OS_TASK_SW()执行软中断进行任务切换.注意到在此过程中,变量OSTCBCur始终包含一个指向当前运行任务OS_TCB的指针

PC_VectSet(uCOS,OSCtxSw)
中断处理函数OSCtxSw,原型来自OS_CPU_A.ASM

_OSCtxSw    PROC   FAR
;
;当高优先级任务A正在运行时,此时由于“中断服务程序”或者“等待信号量”或者“时钟节拍”或者调用“延时函数”
;使任务A挂起,进行任务切换
;中断或异常发生时eflags、cs、eip已经被压栈
;接着将通用寄存器的内容压入堆栈.
;这些寄存器按以下顺序存储到堆栈:EAX、ECX、EDX、EBX、EBP、ESP、EBP、ESI 及 EDI
;注意:按照依次压栈顺序,当执行PUSH SP时,把此时堆栈指针SP的位置记录下来,堆栈中记录的是SP_BX(此时SP指向BX存储单元)
            PUSHA                                  ; Save current task's context
            PUSH   ES                              ;
            PUSH   DS                              ;
;
;uCOS_II.H中定义extern OS_TCB *OSTCBCur;
;SEG:汇编程序将回送变量或标号的段地址值
            MOV    AX, SEG _OSTCBCur               ; Reload DS in case it was altered
            MOV    DS, AX                          ;
;
;LES指令的功能是:把内存中指定位置的双字操作数的低位字装入指令中指定的寄存器、高位字装入ES寄存器
            LES    BX, DWORD PTR DS:_OSTCBCur      ; OSTCBCur->OSTCBStkPtr = SS:SP
;将堆栈指针位置SP保存到任务A的任务控制块OS_TCB的OSTCBStkPtr成员中
            MOV    ES:[BX+2], SS                   ;
            MOV    ES:[BX+0], SP                   ;
;
;调用钩子函数OSTaskSwHook().应用程序人员可以在钩子函数中编写需要的代码
            CALL   FAR PTR _OSTaskSwHook           ; Call user defined task switch hook
;
;当任务A再次得到CPU的控制权后,进入OSCtxSW()函数,执行
;将待运行任务A的控制块复制到OSTCBCur
            MOV    AX, WORD PTR DS:_OSTCBHighRdy+2 ; OSTCBCur = OSTCBHighRdy
            MOV    DX, WORD PTR DS:_OSTCBHighRdy   ;
            MOV    WORD PTR DS:_OSTCBCur+2, AX     ;
            MOV    WORD PTR DS:_OSTCBCur, DX       ;
;
;将待运行任务A的优先级复制到OSPrioCur
            MOV    AL, BYTE PTR DS:_OSPrioHighRdy  ; OSPrioCur = OSPrioHighRdy
            MOV    BYTE PTR DS:_OSPrioCur, AL      ;
;
;从高优先级任务控制块OSTCBHighRdy的OSTCBStkPtr成员中取出任务A私栈的堆栈指针.
            LES    BX, DWORD PTR DS:_OSTCBHighRdy  ; SS:SP = OSTCBHighRdy->OSTCBStkPtr
            MOV    SS, ES:[BX+2]                   ;
            MOV    SP, ES:[BX]                     ;
;
;依次执行POP DS/POP ES/POPA,从任务A的私栈中恢复相关寄存器的内容到CPU的相关寄存器中
            POP    DS                              ; Load new task's context
            POP    ES                              ;
;依次弹出 edi, esi, ebp, esp, ebx, edx, ecx, eax
            POPA                                   ;
;
;
;执行IRET中断返回指令,依次从任务A的私栈中弹出: 
;(a)、任务A上次断点地址的偏移地址到IP寄存器 
;(b)、任务A上次断点地址的段移地址到CS寄存器 
;(c)、程序状态字PSW(中断是开放的) 
;然后跳转到CS:IP位置处(上次断点位置)继续执行任务A的代码
            IRET                                   ; Return to new task
;
_OSCtxSw    ENDP

 

第十章 μC/OS-Ⅱ在80x86上的移植 第十章 μC/OS-Ⅱ在80x86上的移植 10.1 概述 在应用程序主函数中,除了OSInit()之外,还要使用: PC_VectSet(uCOS, OSCtxSw);  //安装μC/OS-Ⅱ中断向量 在起始任务的代码中,使用: PC_VectSet(0x80, OSTickISR);  //安装μC/OS-Ⅱ系统时钟中断向量 PC_SetTickRate(OS_TICKS_PER 阅读详情

相关推荐

UCOSII中断服务程序

UCOSII中断服务程序,用用看吧,其中一个任务调度需要注意。

UCOS环境下的中断程序

BSP_IntVectSet(BSP_INT_ID_USART1, RFID_RxTxISRHandler); //设置中断号 与中断函数 名称相匹配。     BSP_IntEn(BSP_INT_ID_USART1); //使能 中断号的中断     RFID_RxIntEn (); //开启接收中断

robinson_911的专栏 3521

Bladed风电仿真软件新手必看:从界面操作到功率曲线计算的完整指南

本文为风电工程师提供Bladed仿真软件的完整入门指南,涵盖界面操作、功率曲线计算及动态仿真等核心功能。通过实战技巧和常见问题解决方案,帮助新手快速掌握这款全球领先的风电机组仿真工具,提升风电项目开发效率。

weixin_30839881的博客 102

uCOS-II多任务内存资源使用

uCOS-II多任务内存资源使用--采用消息邮箱和信号量集实现

qq_61809269的博客 1128

在中国大陆使用 LiveKit 集成阿里云语音交互服务

通过集成阿里云的语音和模型服务,我们可以快速构建出适合中国用户的 LiveKit 智能语音应用。LiveKit Agents 框架的模块化设计使得替换底层服务变得异常简单,只需要更换相应的插件实例即可。使用 WebSocket 版本的阿里云 ASR 接口以获得更低的延迟。利用通义千问的 Function Calling 能力对接智能家居或企业内部 API。结合 LiveKit 的视频处理能力,打造具备视觉交互的数字人。希望这篇博客能为你在实时音视频与 AI 结合的探索之路上提供帮助!

星空漫野 1236

R语言影像组学实战:从医学图像到预测模型的完整流程(附代码)

本文详细介绍了使用R语言进行影像组学分析的完整实战流程。从环境搭建、数据准备,到医学图像的特征提取与筛选,再到利用机器学习构建预测模型并进行评估,提供了清晰的步骤和可运行的R代码示例,帮助研究者和数据分析师掌握从医学图像到临床预测模型的核心技术。

qsc901234的博客 732

启动ucosii之六PC_VectSet(0x08,OSTickISR)

原型来自PC.C void PC_VectSet (INT8U vect, void (*isr)(void)) { #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */     OS_CPU_SR  cpu_sr; #endif

aimarpp的专栏 3441

COD论文笔记VSCode: General Visual Salient and Camouflaged Object Detection with 2D Prompt Learning

VSCode模型通过引入领域特定提示和任务特定提示,结合提示区分损失,成功地在单一模型中处理多个显著目标检测和伪装目标检测任务。这种方法不仅提高了模型的性能,还展示了其对未见任务的泛化能力。作者使用 Visual saliency transformer ICCV 2021 作为baseline model这张图展示了VSCode模型的整体框架,特别强调了2D提示学习方法。

985小菜鸡 1627

UCOSII 信号量和信号量集实例

代码来自于书本光盘 《嵌入式操作系统UCOSII原理及应用》 实例1信号量 #include "includes.h" #define  TASK_STK_SIZE   512 //任务堆栈长度 OS_STK   StartTaskStk[TASK_STK_SIZE]; //定义任务堆栈区 OS_STK MyTaskStk[TASK_STK_SIZE]; OS_ST

专注的力量 8901

百度飞桨EasyDL图像分类:收费口车辆类型自动识别

车辆类型识别在高速收费路口的应用中,场景相对单一且拍摄角度一致,因此首次训练模型效果优异,准确率达到了95%,鉴于市面上的车辆类型不断更新迭代且部分车辆的主要特征也不断发生变化,因此可在模型投入应用后,持续收集模型实际运行过中产生的数据,定期添加数据进行模型迭代,保证模型效果。企业将AI模型应用到实际场景中以实现停车费用、过路费用的自动计算,在收费口中由相机对每个车辆进行拍摄,拍摄到的图片传输到预测设备上进行类型识别,基于识别出来的车辆类型自动进行费用计算。该功能可在发起训练时选选择对应的开关打开即可。..

PaddlePaddle 1670

MS1030超声波流量计电路实战:如何用15ps精度优化水表设计(附配置代码)

本文深入探讨了如何利用MS1030超声波流量计芯片实现15ps高精度测量,以优化水表设计。文章从系统误差分配出发,详细解析了硬件电路设计要点、SPI通信配置及核心优化技巧,如利用可编程偏置电压和8回波累加功能来提升抗干扰能力与测量稳定性,并附有实用的配置代码示例。

svm4gardener的博客 333

为什么说Ucosii是可剥夺型内核?

为什么说Ucosii是可剥夺型内核? 它总是让所有处于就绪态中优先级高的任务先运行。个运行着的任务使一个比它优先级高的任务进入了就绪态, 当前任务的 CPU 使用权就被剥夺了, 或者说被挂起了, 那个高优先级的任务立刻得到了 CPU 的控制权。 它是怎么实现这一点的呢?ucosii依靠系统时钟开达到目的。ucosii与大多数计算机系统一样,用硬件定时器产生一个周期为毫秒级的周期性中断来实现系统时钟。两次中断之间相隔的时间就是最小时钟单位,称为时钟节拍。硬件定时器以时钟节拍为周期定时产生中断。系统接收到中断请

u011159820的博客 971

系统磁盘从MBR格式转换成GPT格式来升级win11

之前的《》中说到,需要把磁盘格式转化为MBR格式才能执行下去。问题是,win10升级win11要求启动方式为UEFI的话,磁盘格式不能为MBR。其实不升级也不影响啥,但是就是想好看点。所以花了点时间折腾了一下。我这是双系统,所以直接去A系统修复B系统的磁盘格式和引导。

qq_42520962的博客 9041

[UC/OS-II原理及应用]μC/OS-Ⅱ在80x86上的移植

10.1 概述 在应用程序主函数中,除了OSInit()之外,还要使用: PC_VectSet(uCOS, OSCtxSw); //安装μC/OS-Ⅱ中断向量 在起始任务的代码中,使用: PC_VectSet(0x80, OSTickISR); //安装μC/OS-Ⅱ系统时钟中断向量 PC_SetTickRate(OS_TICKS_PER_SEC); //设置μC/OS-Ⅱ系统时钟周期

三月,有人呼唤你的名字 1415

Autosar进阶专栏索引

Autosar进阶专栏索引

赞的博客 3539

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C语言库函数_-_F开头

C语言函数 - F开头函数名: fabs功 能: 返回浮点数的绝对值用 法: double fabs(double x);程序例:#include <stdio.h>#include <math.h>int main(void){ float number = -1234.0; printf("number: %f absolute v...

weixin_33716154的博客 334

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

c语言的_ext函数,F开头的c语言库函数

F开头的c语言库函数(2012-05-06 13:19:26)标签:杂谈函数名: fabs功 能: 返回浮点数的绝对值用 法: double fabs(double x);程序例:#include #include int main(void){float number = -1234.0;printf("number: %f absolute value: %f\n",number, fabs(...

weixin_42516642的博客 668

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

UCOS学习笔记——堆栈

堆栈 Cortex-M3堆栈操作 Cortex-M3使用的是**“向下生长的满栈”**模型。堆栈指针SP指向最后一个被压入堆栈的32位数值。在下一-次压栈时,SP先自减4,再存入新的数值,如图2.3.1所示。 POP操作刚好相反:先从SP指针处读出,上一次被压入的值,再把SP指针自增4。如图2.3.2所示。 在进入ISR时,CM3会自动把一些寄存器压栈,这里使用的是进入ISR之前使用的SP指针(...

万里羊的博客 2612

在ucos系统上使用USART1串口中断函数处理串口数据

以前串口中断接收串口数据都是利用了裸机程序,今天把ucos系统在STM32跑了起来,当然也想利用串口中断接收一下串口数据,下面看看具体步骤。 第一步:在OS系统的start任务中,调用USART1的初始化程序。串口1的初始化程序和裸机同样这里不多说了,但是在最后使能串口中断的时候要注意了,需要添加2条语句   USART_ITConfig(USART1, USART_IT_RXNE, ENAB

u013776495的博客 1万+

ucos iii在zynq上的移植

介绍 软件要求硬件要求 硬件设计 步骤1.调用Vivado IDE和创建项目步骤2.创建一个IP集成器设计第3步:添加和设置ZYNQ处理器系统的IP块步骤4.自定义ZYNQ块我们的设计第5步:添加软外设第6步:生成HDL设计文件第7步合成,实施和生成流 软件设计 步骤1.安装了μC/ OS系统信息库第2步:生成μC/ OS BSP第3步:构建和调试的示范项

Studying…… 1万+

uCOS_II系统实操_外部中断

uCOS_II 的外部中断配置

General_s 3409

启动ucosii之二PC_DOSSaveReturn()

以下函数原型来自PC.C void PC_DOSSaveReturn (void) { #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */     OS_CPU_SR  cpu_sr;//OS_CPU.H typedef uns

aimarpp的专栏 2299

ucosii关于PC的中断基础知识

aimarpp的专栏 1421

可重入函数

可重入函数 什么是可重入函数?C语言如何写可重入函数? 可重入函数是指能够被多个线程“同时”调用的函数,并且能保证函数结果正确的函数。 在C语言中编写可重入函数时,尽量不要使用全局变量或静态变量,如果使用了全局变量或静态变量,就需要特别注意对这类变量的访问的互斥。一般采用以下几种措施来保证函数的可重入性:信号量机制,关调度机制,关中断机制。 需要注意的是,不要调用不可重入函数,当调用了不可重入函数时,会使该函数也变为不可重入函数。一般驱动程序都是不可重入函数,因此在编写驱动程序时一定要注意重入问题。

三月,有人呼唤你的名字 533

uC/OS-II学习笔记(1)

by WC 7.9.2015 本文假设读者对uC/OS-II和多任务知之甚少,但有一定的C语言和单片机基础。为的是为了从0开始学习uC/OS-II。流程图如下图示: 1## 范例1 ## 范例一演示uC/OC-II的多任务处理能力。共有10个任务在屏幕上面随机的位置显示一个0~9的数字。每个任务只显示同一个数字。其包含了13个任务,在运行窗口的左下角增加了两个内部任务。

Virgo的博客 1337
上一篇: ucosii关于PC的中断基础知识
下一篇: 启动ucosii之四OSTaskCreate()
IvyOnion
博客等级 码龄15年 35粉丝 16原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值