启动ucosii之二PC_DOSSaveReturn()

第十章 μ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 阅读详情

以下函数原型来自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 unsigned short OS_CPU_SR; /* Define size of CPU status register (PSW = 16 bits) */
#endif   


    PC_ExitFlag  = FALSE;                                  /* Indicate that we are not exiting yet!    */
    OSTickDOSCtr =     1;                                  /* Initialize the DOS tick counter          */

//将PC系统原来自己的中断向量0x08H提取出来,转给用户自己定义的中断向量0x81H
//空出来的中断向量0x08H留给uCOSII安装时钟中断向量
    PC_TickISR   = PC_VectGet(VECT_TICK);                  /* Get MS-DOS's tick vector                 */
   
    PC_VectSet(VECT_DOS_CHAIN, PC_TickISR);                /* Store MS-DOS's tick to chain             */
   

   /*函数原型: int setjmp(jmp_buf envbuf);*/
    setjmp(PC_JumpBuf);//调用setjmp,用变量envbuf记录当前的位置.以备以后通过longjmp(jmp_buf envbuf,int val);返回到该处
    //可以看出,当在某个需要退出程序,回到DOS的地方,先设置PC_ExitFlag  = TRUE,然后调用longjmp即可到达该处执行下面代码
                                    /* Capture where we are in DOS              */


    if (PC_ExitFlag == TRUE) {                             /* See if we are exiting back to DOS        */
        OS_ENTER_CRITICAL();//OS_CPU.H
        PC_SetTickRate(18);                                /* Restore tick rate to 18.2 Hz             */
        OS_EXIT_CRITICAL();//OS_CPU.H
        PC_VectSet(VECT_TICK, PC_TickISR);                 /* Restore DOS's tick vector                */
        PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);  /* Clear the display                        */
        exit(0);                                           /* Return to DOS                            */
    }
}

void PC_DOSReturn (void)//返回DOS函数
{
     //先设置PC_ExitFlag  = TRUE
 PC_ExitFlag = TRUE;                                    /* Indicate we are returning to DOS         */
 //然后调用longjmp跳转至函数PC_DOSSaveReturn (void)中setjmp保存的地方开始执行
 //第2个参数其实是setjmp的返回值.setjmp初次设置返回0,执行完longjmp后,setjmp返回longjmp的第2个参数
     longjmp(PC_JumpBuf, 1);                                /* Jump back to saved environment           */
}

 

//pc.c中定义#define  VECT_TICK  0x08
//pc.c中定义#define  VECT_DOS_CHAIN  0x81
//该函数从中断向量表中取出指定中断类型号的中断服务函数的地址,赋给一个函数指针
void *PC_VectGet (INT8U vect)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif   
    INT16U    *pvect;
    INT16U     off;
    INT16U     seg;
   
/*
函数名: MK_FP
函数原型: #define MK_FP( seg,ofs )( (void _seg * )( seg ) +( void near * )( ofs ))
函数位置: dos.h
函数说明: MK_FP()不是一个函数,只是一个宏.功能是做段基址加上偏移地址的运算,也就是取实际地址.
*/   
    pvect = (INT16U *)MK_FP(0x0000, vect * 4);        /* Point into IVT at desired vector location     */
    OS_ENTER_CRITICAL();
    off   = *pvect++;                                 /* Obtain the vector's OFFSET                    */
    seg   = *pvect;                                   /* Obtain the vector's SEGMENT                   */
    OS_EXIT_CRITICAL();
    return (MK_FP(seg, off));
}


/*
中断向量是指中断服务程序入口地址的偏移量与段基值,一个中断向量占据4字节空间.
中断向量表是8088系统内存中最低端0x0000h开始的1K字节空间,它的作用就是按照中断类型号从小到大的顺序存储对应的中断向量,总共存储256个中断向量.
在中断响应过程中,CPU通过从接口电路获取的中断类型号(中断向量号)计算对应中断向量在表中的位置,并从中断向量表中获取中断向量,将程序流程转向中断服务程序的入口地址
*/
//vect向量号,一个内部中断(软中断)向量号
//参数2-中断处理函数.
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();
}

 

/*
uCOS-II定义频率,以改变钟节拍的速率.
在DOS下,每秒产生18.20648次时钟节拍,或每隔54.925ms一次.这是因为82C54定时器芯片没有初始化,而使用默认值65535的结果.
如果初始化为58659,那么时钟节拍的速率就会精确地为20.000Hz
*/
void PC_SetTickRate (INT16U freq)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif   
    INT16U     count;

//1.193Mhz/65536 ≈ 18.2HZ每秒18次中断
    if (freq == 18) {                            /* See if we need to restore the DOS frequency        */
        count = 0;
    } else if (freq > 0) {                       
                                                 /* Compute 8254 counts for desired frequency and ...  */
                                                 /* ... round to nearest count                         */

//设置计数count=1.193Mhz/f + 0.5
        count = (INT16U)(((INT32U)2386360L / freq + 1) >> 1);
    } else {
        count = 0;
    }
    OS_ENTER_CRITICAL();
//控制字设置为通道0; 先读低字节,再读高字节; mode3-方波信号发生器; 计数器使用二进制.
    outp(TICK_T0_8254_CWR,  TICK_T0_8254_CTR0_MODE3); /* Load the 8254 with desired frequency          */ 
    outp(TICK_T0_8254_CTR0, count & 0xFF);            /* Low  byte                                     */
    outp(TICK_T0_8254_CTR0, (count >> 8) & 0xFF);     /* High byte                                     */
    OS_EXIT_CRITICAL();
}


BOOLEAN PC_GetKey (INT16S *c)
{
    if (kbhit()) {                                         /* See if a key has been pressed            */
        *c = (INT16S)getch();                              /* Get key pressed                          */
        return (TRUE);
    } else {
        *c = 0x00;                                         /* No key pressed                           */
        return (FALSE);
    }
}

嵌入式实时操作系统uCOS-II(中文版) 嵌入式实时操作系统uCOS-II(中文版)电子书,本书介绍了如何使用 μC/OS-II。 立即下载

相关推荐

嵌入式实时操作系统uCOSII光盘RAR

嵌入式实时操作系统uCOSII光盘RAR,具体参考: http://blog.youkuaiyun.com/htttw/article/details/7513868

DOS常用命令(从入门到精通)

DOS命令学习 一、DOS使用常识 DOS(Disk Operating System)是一个使用得十分广泛的磁盘操作系统。 常见的DOS有两种:IBM公司的PC-DOS和微软公司的MS-DOS,它们的功能、命令用途格式都相同,我们常用的是MS-DOS。 DOS的概况 DOS(Disk Operating System)是一个使用得十分广泛的磁盘操作系统,就连眼下流行的Windows9...

人生若只如初见的博客 21万+

Ucos在80x86上的移值版本, 编译成DOS下的EXE文件

Ucos在80x86上的移值版本, 编译成DOS下的EXE文件

【转帖】dos批处理命令详解

【转帖】dos批处理命令详解1.Echo 命令 打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。 语法: echo [{on│off}] [message] Sample:@echo off / echo hello world 在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定格式的文

hangke20020的专栏 1185

多模态情感识别(MER)数据集实战指南:从IEMOCAP到应用落地

本文提供了多模态情感识别(MER)从数据集到应用落地的完整实战指南。以经典IEMOCAP数据集为例,详细讲解了音频、视觉、文本等多模态数据的预处理、特征提取与融合技术,并分享了模型训练调优心得及面向智能客服、在线教育等场景的部署考量,帮助开发者快速构建高效可用的MER系统。

h3i4j的博客 1070

PnP 单目相机位姿估计(二):solvePnP利用二维码求解相机世界坐标

前言 原理简介 输入参数准备 1 objectPoints特征点世界坐标 2 imagePoints特征点在摄像头下的像素点坐标 3cameraMatrixdistCoeffs内参矩阵和畸变矩阵 相机世界坐标的求解 1求世界坐标中的点在相机坐标系下的坐标 2求相机在世界坐标中的坐标 3效果求解相机在世界坐标系下的坐标点 4求解代码1.前言  很多时候,当我们利用单目相机获取图像时,往往只能获取图像中

cocoaqin的博客 5万+

手把手以实例教你使用DOSBOX入门UCOS-II操作系统

操作系统 (英语:Operating System,缩写:OS) 是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序。根据运行的环境,操作系统可以分为桌面操作系统,手机操作系统,服务器操作系统,嵌入式操作系统等。本文从实例出发详细介绍一下UCOS-II和DOSBOX的入门级使用,希望对各位有所帮助。

m0_66360845的博客 4503

单点DToF激光测距传感器各家产品的比较

汇总DToF 单点测距传感器的相关信息

Linux 设备驱动概述及开发环境构建 (一) 1773

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

混合整数规划(MIP)在资源优化中的实战应用

本文深入探讨了混合整数规划(MIP)在资源优化中的实战应用,从菜市场采购到工厂调度,再到物流配送和钢铁厂切割问题。通过分支定界法和割平面法等技术,MIP能够有效解决包含整数和连续变量的复杂优化问题,提升企业运营效率。文章还介绍了现代求解器的优化策略和实际项目中的避坑指南,帮助读者更好地应用MIP技术。

weixin_30500105的博客 91

工业相机图像格式深度解析:从Mono8到Mono12的选型与应用

本文深度解析工业相机黑白图像格式,重点对比Mono8、Mono10与Mono12的核心差异。文章从位深、动态范围和数据量等关键概念切入,详细阐述了不同格式的优缺点及适用场景,为工业视觉项目中的相机选型提供实战指南,帮助用户在精度、速度与成本间做出最优决策。

weixin_29207439的博客 262

启动ucosii之三PC_VectSet(uCOS,OSCtxSw)

原型来自PC.C PC_VectSet(uCOS,OSCtxSw); //vect向量号,一个内部中断(软中断)向量号 //参数2-中断处理函数.即中断号为0x80的中断处理函数 void PC_VectSet (INT8U vect, void (*isr)(void)) { #if OS_CRITICAL_METHOD == 3                      /* Al

aimarpp的专栏 4287

数仓建模:维度表合并时,如何处理可能出现的数据冲突?

通过以上方法,可以有效地处理维度表合并时可能出现的数据冲突,确保合并后的数据完整性、一致性和准确性,满足业务需求和数据仓库的性能要求。在合并过程中,需要根据实际情况选择合适的处理方法,并进行充分的测试和验证。(2)实战中总结的SQL技巧,帮助SQLBOY在SQL语言上有质的飞越,无论你应对业务难题及面试都会游刃有余【如果您觉得本文还不错,对你有帮助,那么不妨可以关注一下我的数字化建设实践之路专栏,这里的内容会更精彩。技巧总结,让你认识不一样的数仓。,数据库会抛出异常,可根据异常处理机制解决。

石榴姐yyds 1132

PC下简单任务之uCOSII启动脉络

#include "includes.h" #define  TASK_STK_SIZE   512   //任务堆栈长度 //typedef unsigned int   OS_STK;定义在OS_CPU.h中 OS_STK   TaskStartStk[TASK_STK_SIZE];  //定义任务堆栈区-大小为2*512=1024byte=1k INT16S   key;

aimarpp的专栏 1241

实时系统vxWorks - 虚拟机环境搭建

概述VxWorks 操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的...

不只会拍照的程序猿 7850

STM32实现等精度测频

上一章介绍了利用STM32的TIM的捕获功能实现频率测量的方法,但测量误差受被测信号频率的影响,不适合测量频率变化较大的。本章将介绍等精度测频的方法以及STM32的实现。STM3...

zhang062061的专栏 3457

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

UCOS-II移植ARM的读书笔记(12.11--12.25)

以下内容转自http://blog.ednchina.com/embedtek/UCOS-II移植ARM的读书笔记(12.11) 真是很郁闷,昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了。。。5555。。。一个晚上工作的结果啊,关键是我是第一次也是正式开始移植的学习之路啊。。。真是够倒霉的。。。。今天在工作之前先把昨天的笔记重新回顾一下,其实后来想想也许是

bird67的专栏 5431

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

uc/os2学习笔记

test.c的MIAN函数 void  main (void){    PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK);      /* Clear the screen                         */    OSInit();                                            

森林之音的专栏 666

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

启动ucosii之七PC_SetTickRate(OS_TICKS_PER_SEC)

/* uCOS-II定义频率,以改变钟节拍的速率. 在DOS下,每秒产生18.20648次时钟节拍,或每隔54.925ms一次.这是因为82C54定时器芯片没有初始化,而使用默认值65535的结果. 如果初始化为58659,那么时钟节拍的速率就会精确地为20.000Hz */ void PC_SetTickRate (INT16U freq) { #if OS_CRITICAL_ME

aimarpp的专栏 3188

UCOS-II移植ARM的读书笔记(12.16)续

范例三:在该范例中首先定义了一个用户任务数据结构,在这个结构中有该范例所需要的数据参数,和每个任务相关的,因此定了一个该数据结构类型的变量数组,分配给7个自建的任务另外使用了消息队列的通讯方式,可以容纳多则消息。建立消息队列需要两个元素即OS_EVENT的数据结构和一串指针。void  main (void){    PC_DispClrScr(DISP_BGND_BLACK);   

永远的BATIGOAL 1671

启动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

Windows xp虚拟机搭建uCOS-II 开发环境,亲测

下载uCOS-II 源码包、编译工具Borland c/c++ v4.5安装包、汇编工具TASM5.0 连接: 安装流程 2.1 安装Borland c/c++ v4.5 打开BC45文件夹,找到INSTALL 应用程序,双击进行安装。 安装路径C:\BC45 2.2 安装TASM 打开tasm5 文件夹,找到INSTALL 应用程序,双击进行安装 安装路径:C:\TASM 安装完...

madao1234的博客 1826

ucosii关于PC的中断基础知识

aimarpp的专栏 1421
上一篇: PC下简单任务之uCOSII启动脉络
下一篇: ucosii关于PC的中断基础知识
IvyOnion
博客等级 码龄15年 35粉丝 16原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值