在51系列单片机上移植uCOS-II操作系统

合集下载

实操性最强:uCOS-II移植到STM32上的详细步骤;

实操性最强:uCOS-II移植到STM32上的详细步骤;

前言:说点废话,网上有很多关于uCOS-ii移植的文章,好多都是千篇一律,理论性很强,分析了一大堆虚头巴脑的东西,真想问他们,你确定你分析的这些东西是需要你做的工作吗?实操性严重欠缺。

这方面我也走了很多弯路,下面就将自己的移植过程一步步的记录下来,也给大家做做参考。

首先,简单总结一下移植的大概过程:(1)去uC/OS-ii官网下载你要移植芯片CPU的相关案例,不一定完全对应,那就找相应系列吧。

(2)编程环境一般有两种,分别是IAR和MDK,这个根据你自己的编程环境进行下载。

(3)本案例需要将uC/OS-II 移植到STM32F103ZET6上,而我使用的编程环境是MDK,很遗憾,官网上提供的案例是基于IAR的,所以要基于IAR的案例进行更改。

(4)使用MDK创建一个无操作系统的最简单程序,确保这个程序能够使用,这样做的目的是为了一步步的排查错误,假如无操作系统时,都有错误,移植过程中也肯定会有编译错误,那么在排查错误的时候也就增加了难度,不会写物操作系统的简单程序怎么办。

那就不要往下看了。

(5)移植的最大的改动主要有两部分,一个是一些头文件的增减,另外一个就是向量表中PendSV_Handler和SysTick_Handler的修改。

这里我要吐槽一下,网上说了一大堆关于什么OS_CPU.H的更改还有各种函数的的分析,这都是扯淡。

这些根本就不用移植者去修改,官网提供的案例都已经提供了,除非你选择移植的CPU是比较偏的,那么这些东西需要移植者自己去编写。

好了,下面就开始详细的记录怎么去移植。

一、创建一个无操作系统的简单裸板系统1.创建源文件工程文件夹,如下图所示:其中文件夹“CMSIS”为内核的接口,包含的文件如下图文件夹STM32_StdPeriph为固件驱动文件夹,这个把STM32的固件全都添加进去即可。

文件夹User为其他文件,如下图所示:文件夹Output和List主要是放那些编译产生的乱七八糟的文件,为了使工程代码更加简洁。

实验一 uCOS-II的移植

实验一 uCOS-II的移植

实验一uC/OS-II的移植1.实验目的(1)理解uCOS-II实时内核的工作原理;(2)熟悉uCOS-II在XS128上的移植过程;(3)掌握uCOS-II移植的细节。

2.实验任务(1)观察示例程序中的代码,体会实时操作系统与前后台程序的不同之处。

(2)完成由前后台程序编程到基于实时操作系统编程的思想转变。

3.预习要求(1)参考《嵌入式实时操作系统uCOS-II》(第2版),熟悉uCOS-II各模块的基本工作原理。

(2)参考《单片机与嵌入式系统开发方法》第9章内容以及《uCOS-II移植说明文档》。

熟悉uCOS-II在XS128上的移植过程。

4.实验步骤(1)打开示例程序,观察程序结构。

(2)识别出哪些是与硬件无关的文件,哪些是移植需要修改和添加的文件。

(3)打开OS_CPU.H文件,该文件定义CPU的数据类型,定义相关的宏。

打开OS_CPU_C文件,分析文件里各个函数的作用。

这两个文件是与CPU特性有关的文件。

(4)分别打开OS_CFG.H, INCLUDES.H. OS_CFG.H这三个文件,了解这三个文件的作用。

用户根据自己的应用系统来定制合适的内核服务功能.包括两个文件:OS_CFG.H, INCLUDES.H. OS_CFG.H是来配置内核, 用户根据需要对内核进行定制, 留下需要的部分, 去掉不需要的部分, 设置系统的基本情况. 比如系统可提供的最大任务数量, 是否定制邮箱服务, 是否需要系统提供任务挂起功能, 是否提供任务优先级动态改变功能等等;头文件INCLUDES.H为整个实时系统程序所需要的文件,包括了内核和用户的头文件。

(5)修改.prm文件中的中断向量,将其中的ROM_C000 = READ_ONLY DATA_NEAR IBCC_NEAR 0xC000 TO 0xFEFF;改为ROM_C000 = READ_ONLYDATA_NEAR IBCC_NEAR 0xC000 TO 0xEEFF;将结尾处原有的VECTOR 0 _Startup;改为VECTOR ADDRESS 0xEFFE _Startup;再添加上VECTOR ADDRESS 0xEFF6 OSCtxSw;VECTOR ADDRESS 0xEFF0 OSTickISR两个中断向量。

HL-C8051F嵌入式实验开发系统、单片机实验箱

HL-C8051F嵌入式实验开发系统、单片机实验箱

HL-C8051F嵌入式实验开发系统/单片机实验箱一、概述HL-C8051F嵌入式实验/开发系统是针对C8051F单片机(SOC)而开发的。

C8051F单片机完全兼容MCS-51指令系统,利用此平台,不仅可以开展传统的MCS-51单片机教学,如指令系统、中断系统、I/0口接口实验、外围逻辑和通信实验,也可以讲授片上系统(SOC)的概念、体系结构、设计方法、系统应用。

该实验系统实现了C8051F单片机片上的全部资源,并集成了USB主从通信,TCP/IP以太网通信,UCOS-II嵌入式系统移植源码。

我们编写了所有功能和模块的测试程序,提供了大量的实例,使学生在学会C8051F系列片上系统单片机开发方法的同时,感受到片上系统单片机在设计方法上的革新和解决的高效。

二、实验系统组成:(1)CPU板:CPU核心模块采用C8051F020芯片,该芯片是C8051F系列单片机中功能最为其全的一款;集成开发环境支持Silicon Labs IDE和KEIL C软件。

(2)片内:64K FLASH,4K XRAM片外扩展:256K FLASH,32K XRAM(3)CPU板C8051F020芯片I/0引脚全部引出,可以和用户外部电路连接;(4)实验系统带有JTAG接口,并配有HL-EC5型USB高速通讯专业仿真器,通过4脚的JTAG接口可以进行非侵入式、全速的在线系统调试、仿真;(5)4*4阵列式键盘;(6)8位逻辑电平开关输出、8位LED逻辑电平显示;(7)6位动态八段LED数码管;(8)2路单脉冲信号发生电路和1路8MHZ时钟发生电路;(9)时钟分频电路;(10)模拟量发生器电路和逻辑笔电路;(11)8*8LED点阵及驱动电路;(12)128*64LCD液晶显示屏;(13)蜂鸣器电路;(14)直流电机测速电路;(15)四相步进电机及驱动电路;(16)继电器电路及接口;(17)双通道RS-232接口;(18)SPI接口,LED数码管显示;(19)IIC接口,接24C01串行EEPROM;(20)IIC接口,PCF8563日历时钟;(21)8路12位AD,2路12位DA接口;(22)D12USB从机通信;(23)SL811USB主机通信;(24)TL801910M以太网通信;三、C8051F020单片机主要特点:1、模拟外设:(1)逐次逼近型(SAR)12位ADC(ADC0)●可编程转换速率,最大100ksps●可多达8个外部输入;可编程为单端输入或差分输入●可编程放大器增益:16、8、4、2、1、0.5●数据相关窗口中断发生器●内置温度传感器(±3°C)(2)8位ADC(ADC1)●可编程转换速率,最大500ksps●8个外部输入●可编程放大器增益:4、2、1、0.5(3)两个12位DAC●可以同步输出,用于产生无抖动波形(4)两个模拟比较器●16个可编程回差电压值●可用于产生中断或复位(5)电压基准●内部基准(2.4V)(6)精确的VDD监视器和欠压检测器●可通过MONEN引脚允许或禁止。

在51系列单片机上移植uCOS

在51系列单片机上移植uCOS

μC/OS II在MCS51单片机上的移植2008-05-29 12:07摘要:嵌入式系统融合了微电子、计算机软/硬件、通信和电子工程等多种技术、广泛应用于各种工业和民用领域,是科技集成创新的主要手段。

嵌入式操作系统也由于编程方式比传统方式有着明显的优越性,在越来越多的场合得到广泛的应用。

在中国,单片机具有相当广泛的使用基础,虽然51系列单片机功能相对较低,但是针对某些任务较简单、要求具备较高实时性的场合,研究嵌入式系统的移植还是具有重要的现实意义。

本文从探讨嵌入式系统移植的意义开始,通过阐述嵌入式系统在过去几十年期间的发展过程以及当今的发展现状,总结出嵌入式系统的发展趋势,并简要的描述μC/OS II在MCS51单片机上的移植方法,综合讲述了嵌入式系统移植这一课题的技术和背景。

关键词:μC/OS II 移植意义现状发展1 引言:单片机是电子信息行业最杰出的作品之一,由于它具有出色的面向控制能力,因此在工业控制、智能仪器仪表、家用电器、外设控制、机器人和军事装置等方面都得到了广泛的应用。

但是当面对多任务的应用场合时,如果没有精心复杂的设计以及丰富的后期维护调试经验,采用传统的编程方式设计往往会发生不可预料的错误且难以弥补。

此外,在这种条件下应用程序对硬件具有很强的依赖性,硬件只要稍微发生变化,软件就必须要作大量的变更和调试工作。

这也是限制单片机应用进一步发展的重要原因。

在电子技术迅猛发展的当今,随着实用电子系统的复杂化和系统实时性需求的提高,以及应用软件的系统化发展,嵌入式实时操作系统(Embedded Real-time Operating System)已经广泛地使用在各式各样的以单片机为代表的硬件平台上,从而很大程度的解决了多任务使用环境的需求问题。

在实际的生产生活中,使用着大量以MCS51为代表的8位单片机,虽然性能及存储空间有限,但是从经济方面考虑,对于某些应用场合,在8位MCU上使用操作系统依然是可行的。

UCOS-II在51单片机上的移植

UCOS-II在51单片机上的移植

UCOS-II在51单片机上的移植做操作系统的移植首先明白什么是移植,操作系统是一种鱼硬件(处理器)相关的软件,根据某一种处理器来设计的操作系统通常不能运行在那其他处理器。

所谓的移植是指修改操作系统,然后加载到一个处理器上。

本文只讲解步骤,至于理论知识,需要大家自己学习。

步骤:1,在UCOS-II的官网上下载,操作系统。

2,在网上找到或者自己建三四个文件:OS_CPU_A.ASSMOS_CPU.HOS_CPU_C.COS_CFG.H以上文件需要修改3,移植源码的编写和修改❖OS_CPU.H1)定义与编译器有关的数据类型typedef unsigned char BOOLEAN; /* 不能使用bit定义,结构中无法使用*/typedef unsigned char INT8U; /* 无符号8位数*/typedef unsigned char INT8S; /* 有符号8位数*/typedef unsigned int INT16U; /* 无符号16位数*/typedef signed int INT16S; /* 有符号16位数*/typedef unsigned long INT32U; /* 无符号32位数*/typedef signed long INT32S; /* 有符号32位数*/typedef float FP32; /* 单精度浮点数*/typedef double FP64; /* 双精度浮点数*/typedef unsigned char OS_STK; /* 定义堆栈入口宽度为8位*/typedef unsigned char OS_CPU_SR; /* 定义CPU状态字的宽度为8位*/2)定义堆栈增长方向#define OS_STK_GROWTH 0 /* MCS-51堆栈从下往上增长,1=向下,0=向上*/3)定义任务级的任务切换宏#define OS_TASK_SW() OSCtxSw() /* 任务级的任务切换宏*/4)定义临界段宏:#define OS_ENTER_CRITICAL() EA=0#define OS_EXIT_CRITICAL() EA=1❖OS_CPU_C.C①初始化任务栈void *OSTaskStkInit(void(*task)(void *pd), void *ppdata, void *ptos, INT16U opt) REENTRANT{O S_STK *stk;p pdata=ppdata; //pata data 为52文件关键字o pt =opt; /* opt没被用到,保留此语句防止警告产生 */s tk =(OS_STK *)ptos; /* 任务堆栈最低有效地址*/*stk++=15; /* 任务堆栈长度*/ *stk++=(INT16U)task & 0xFF; /* 任务代码地址低8位*/*stk++=(INT16U)task >> 8; /* 任务代码地址高8位*//* 处理器是按特定的顺序将寄存器存入堆栈的,所以用户在将寄存器存入堆栈的时候也要依照这一顺序 */*stk++=0x00; /* PSW*/*stk++=0x0A; /* ACC*/*stk++=0x0B; /* B */ *stk++=0x00; /* DPL*/*stk++=0x00; /* DPH*/*stk++=0x00; /* R0 */ *stk++=0x01; /* R1 */ *stk++=0x02; /* R2 */ *stk++=0x03; /* R3 */ *stk++=0x04; /* R4 */ *stk++=0x05; /* R5 */ *stk++=0x06; /* R6 */ *stk++=0x07; /* R7 */ /* 不用保存SP,任务切换时根据用户堆栈长度计算得出*/*stk++=(INT16U)(ptos+MAX_STK_SIZE) >> 8; /* ?C_XBP 仿真堆栈指针高8位 */*stk++=(INT16U)(ptos+MAX_STK_SIZE) & 0xFF; /* ?C_XBP 仿真堆栈低8位*/r eturn ((void *)ptos); /* 返回最低地址,这里不用弹出栈顶指针是为了提高计算效率 */}②初始化定时器void InitTimer0(void) REENTRANT{TMOD=TMOD&0xF0; //屏蔽高四位TMOD=TMOD|0x01; /* 模式1(16位定时器),仅受TR0控制 */ TH0=TIMER_20MS_TH0;TL0=TIMER_20MS_TL0;E A=0; /* EA和ET0,51上电缺省值为0,EA将在OSStartHighRdy()中打开*/ET0=0; /* 满足在OSStart()前不产生时钟中断的要求,系统启动后第一时间开定时器T0中断 */TR0=1;}❖OS_CPU_A.ASM编写4个函数OSStartHighRdy()OSCtxSw()OSIntCtxSw()OSTickISR()❖OS_CFG.H主要为参数和使能的宏定义#define MAX_STK_SIZE 1024 /* 最大堆栈大小为1k*/#define OS_MAX_EVENTS 5 /* 应用程序中事件控制块的最大数量(必须大于零)*/#define OS_MAX_FLAGS 2 /* 应用程序中事件标志组的最大数目(必须大于零)*/#define OS_MAX_MEM_PART 5 /* 内存分区的最大数目(必须大于零)*/#define OS_MAX_QS 2 /* 应用程序中队列控制块的最大数目(必须大于零)*/#define OS_MAX_TASKS 11 /* 应用程序中任务的最大数目(必须大于2)*/#define TASK_START_PRIO 2 /* 应用程序开始优先级*/#define OS_LOWEST_PRIO 12 /* 定义可分配的最低优先级(必须大于63)*/#define TASK_STK_SIZE 512 /* 默认任务堆栈大小*/#define OS_TICKS_PER_SEC 50 /* 设置每秒节拍数*/#define TIMER_20MS_TH0 0x70 /* CPU=22.1184MHz, OS_TICKS_PER_SEC=50, TH0=0x70 */#define TIMER_20MS_TL0 0x00 /* CPU=22.1184MHz, OS_TICKS_PER_SEC=50, TL0=0x00 */晶振频率为22.1184MHz时才有OS_TICKS_PER_SEC=50,OS_TICKS_PER_SEC=50。

uCOS-II在51单片机上的移植

uCOS-II在51单片机上的移植

功能
处理临界段方式选择 堆栈增长方向 进入临界区 退出临界区 就绪态最高优先级任务运行 任务级任务切换 中断级任务切换 时钟节拍 任务堆栈初始化
表7-1 需要修改的关键函数和宏定义
6
7.1.6 INCLUDES.H

* * * * * * 文件名 : INCLUDES.H * 作者 : Jean J. Labrosse ****************************************************************************/
9
7.1.8 OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()
临界代码的概念。 uC/OS-II定义的两个宏。
{ OS_ENTER_CRITICAL(); /* µC/OS-II 临界代码段 */ OS_EXIT_CRITICAL(); }
#define OS_ENTER_CRITICAL() EA=0 #define OS_EXIT_CRITICAL() EA=1 #define OS_ENTER_CRITICAL() \
例如,任务A和任务B都要调用函数Swap(), 而该函数又使用了全局变量temp。于是当任 务A调用Swap()函数期间,系统发生了任务 切换而使任务B也调用了Swap(),那么任务B 将要改变全局变量temp的值,使任务A传递 给全局变量temp的值丢失而出现错误。
一般来说,一个可重入函数应该在函数中只 使用局部变量,因为函数的局部变量存储在 任务的堆栈中,所以可保证不同的任务在调 用同一个函数时不会发生冲突。
/ ******************* 与处理器相关的代码 ********************/ #define OS_CRITICAL_METHOD ?? #if OS_CRITICAL_METHOD = = 1 #define OS_ENTER_CRITICAL() ?? #define OS_EXIT_CRITICAL() ?? #endif

OS在C51平台上的移植及应用的开题报告

OS在C51平台上的移植及应用的开题报告

嵌入式实时操作系统μC/OS在C51平台上的移植及应用的开题报告一、选题背景及研究目的嵌入式实时操作系统(RTOS)是嵌入式系统中广泛使用的操作系统,它为具有实时性要求的应用程序提供了资源管理、任务调度、通信机制等功能,大大提高了嵌入式系统的可靠性、可维护性和可扩展性。

其中,μC/OS是一个功能强大、可靠性高、开放式的RTOS,广泛应用于微处理器、嵌入式网络和控制系统等领域。

C51是一种广泛使用的8位单片机,具有成本低、易于使用等优点,广泛应用于消费电子、家电、汽车电子等领域。

本文旨在通过在C51平台上移植μC/OS,分析实现的过程、开发工具、硬件平台及移植后的应用效果,为嵌入式系统的开发提供技术支持和参考。

二、研究内容和方法本文的主要研究内容包括以下几个方面:1.μC/OS的介绍及功能特点2.C51平台的介绍及特点,以及μC/OS在C51平台上的需求分析3.μC/OS在C51平台上的移植过程,包括内存管理、任务调度、消息队列等4.移植后的测试和应用,包括任务执行时间、系统资源占用率、通信效率、可靠性等指标的测试,以及在实际应用中的效果5.总结与展望,对移植过程中遇到的问题进行总结,对嵌入式操作系统未来的发展趋势进行展望在研究方法上,本文采用了理论分析和实验验证相结合的方法。

首先,对μC/OS 的功能特点、内核原理等进行理论分析;其次,结合C51平台的特点进行需求分析和移植实现;最后,利用实验验证对移植后的系统进行实测和分析。

三、预期成果及意义本文的预期成果包括以下几个方面:1.基于C51平台成功移植μC/OS,并在实验中进行了测试和分析2.验证了在C51平台上利用μC/OS构建实时嵌入式系统的可行性和可靠性3.提出了在移植μC/OS时需要注意的问题和经验,为相关研究提供了参考本文的意义在于:1. 为嵌入式系统开发人员提供技术支持和经验总结,提高嵌入式系统开发的效率和可靠性;2. 推广μC/OS在C51平台上的应用,扩展其应用范围,促进嵌入式系统的发展;3. 贡献一份力量,推动嵌入式操作系统的发展,为自动化、智能化等领域的发展提供支撑和保障。

uip在单片机上的移植精讲

uip在单片机上的移植精讲

第一章基于单片机的网络编程概述随着网络技术的迅猛发展,Internet已经走进千家万户,越来越多的人拥有了随时随地上网的条件,享受着网络带来的方便快捷的生活。

同时,随着嵌入式控制技术的成熟,网络也逐步与之结合,深入到工业、楼宇、家居智能化等领域,实现远程数据采集、远程控制等功能。

网络化已经成为新一代嵌入式系统发展的一个重要趋势。

试想不久的将来,坐在办公室的电脑前就能查看和控制家里的门窗和灯的状态,甚至可以在下班时把家里配好汤料的电饭煲打开,到家就能闻到扑鼻而来的香味了。

盛行全球的Internet网络是基于TCP/IP协议族为基础组建的,TCP/IP是网络通讯系统互联的事实标准。

研究嵌入式系统的网络化,就要先从TCP/IP的概念入手。

1.1 TCP/IP的概念及分层结构TCP/IP协议是传输控制协议的简称,它实际上是一个协议族,包括许多相关协议。

其中最核心的协议是IP(网际协议)和TCP(传输控制协议),其它还包括ARP(地址解析协议)、RARP(逆地址解析协议)、ICMP(Internet控制报文协议)、UDP(用户数据报协议)、IGMP(Internet组管理协议)、DNS(域名系统)、TFTP(简单文件传送协议)、BOOTP(引导程序协议)、SNMP(简单网络管理协议)、Telnet(远程控制协议)、FTP(文件传送协议)、SMTP(简单邮件传送协议)等重要协议。

并且,随着网络技术的发展,还会不断有新的协议加入到TCP/IP协议族。

这些协议规范了不同的场景下的网络互连,实际应用中可以根据系统的需要使用其中的一些协议。

从TCP/IP协议的数量就可以看出,Internet网络是一个比较复杂的系统,能适配多种应用场景,根据使用协议的不同而实现不同的功能。

为了降低网络设计的复杂性,设计者将以分层的方式组织TCP/IP协议,每一层可能包括不同通信服务的多种协议。

从最底层的硬件开始,每一层都建立在其下一层的基础上,并负责向其上一层提供服务。

μCOSII简介

μCOSII简介

0 引言μC/OS是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。

μC/OS-II 的前身是μC/OS,最早出自于1992 年美国嵌入式系统专家Jean brosse 在《嵌入式系统编程》杂志的5 月和6 月刊上刊登的文章连载,并把μC/OS 的源码发布在该杂志的BBS上。

μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。

CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。

用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌人到开发的产品中。

μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至 2KB 。

μC/OS-II 已经移植到了几乎所有知名的CPU 上。

严格地说μC/OS-Ⅱ只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。

没有提供输入输出管理,文件系统,网络等额外的服务。

但由于μC/OS-Ⅱ良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。

μC/OS-Ⅱ目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。

1.任务管理μC/OS-Ⅱ中最多可以支持64 个任务,分别对应优先级0~63,其中0 为最高优先级,63为最低级。

系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。

μC/OS-Ⅱ提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。

系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整形变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前cpu 的利用率。

嵌入式仿真系统的设计与实现的研究

嵌入式仿真系统的设计与实现的研究
TEC HNOI 《〕 INEOR MA 丁 ) 丫 ION
I 丁技 术
嵌入式仿真系统的设计与实现的研 究
王宇雷 (湖南省类底市高级技工学校
4 1700 0 )
摘 要: 简要介绍嵌人式操作系 统”C/ OS2 1 的组成和工作原理, 详细分析仿真系 统的设计与实现的必要条件,明确指出 移植中的 关键问题。以 5 1 单片机系统为例,提出了相应的解决办法,相关实验测试进一步证实了本仿真系统。 关键词 嵌入式 操作系 统 u C/ OS2 I 中图分类号:T P27 文献标识码: A 文章编号: 1672- 3791(2007)01(a卜0052- 01 51 单片机利用仿真堆栈存储可重入函 数 仿真堆栈不同于工作堆栈, 它的 嵌入式操作系统在许多领域得到广泛应 的局部变量。 用。u C/ OS2 I 是一种源代码公开的可移 框架实际由编译系统软件提供。 植、 可裁剪的多任务嵌入式操作系统, 其功能 3 .3 任务堆栈和任务堆栈附加段的建立 51 单片机内部 128 字节的数据存储器仅 完备、性能可靠,与其它嵌入式操作系统相 所以 比,更适用于硬件资源有限的单片微机系统。 适合安排工作堆栈和存放部分全局变量, 在国内,随着高速、高性能 5 1 系列单 任务堆栈应建立在外部数据存储器中. 任务 堆栈一般是以静态数组的形式建立起来, 既便 片机的出现, 5 1 系列单片微机的应用更趋 使 于初始化和定位, 又便于控制其深度。每一个 广泛。开发基于嵌入式操作系统的仿真系统 任务均有相应任务堆栈指针指向其任务堆栈 的单片微机,具有一定的现实意义。 的初始位置。 3.4 任务调度的机理 2 NC/ OS2 II工作原理 当系统发生任务调度时,旧任务首先把 2. 1 u C/ OS2 “ 任务调度 的 机制 其部分上下文环境参数压入工作堆栈中, 这 调度是指任务间的转换, 即保存一个任务 些参数包括任务程序中断的返回地址,还有 的执行环境并恢复另一个任务的执行环境, 也 称任务上下文的切换, 其本质是任务堆栈与工 所有寄存器内容。另外还有部分上下文环境 保存在仿真堆栈中的, 并 作堆栈的相互复制。工作堆栈则是正在占用 参数涉及局部变量, CPU的任务所使用的堆栈, 也称硬件堆栈或系 会在任务切换时,被复制到相应的旧任务的 任务堆栈附加段中。全部工作堆栈的内容将 统堆栈。每台机器或者说每个系统只有一个 被复制到外部数据存储器中。 然后, 新任务把 工作堆栈, CPU通过堆栈指针操作工作堆栈的 内容, 如图 1 中( 1) , (2 ) 两部分所示。箭头 其存放于外部数据存储器中的任务堆栈内容 组①是指工作堆栈的内容向任务堆栈的复制 , 复制到内部工作堆栈中. 通过适当调整堆栈 指针值,可用中断返回指令来正确建立部分 而②则恰恰相反。每一次任务的调度都要进 行任务上下文的保存和切换工作, 即将当前工 上下文环境和恢复任务程序在上次调度时被 中断了的执行地址。 作堆栈的内容复制到旧任务的任务堆栈中, 同 3. 5 移植代码说明 时也把新任务的任务堆栈内容装入工作堆栈 u C/ OS2 I 移植过程中 需要修改的 文 中去 。 件有五个, 即CS- CPU- C. C , OS_CPU- A. 2 . 2 仿真系统中u C/ OS2 ” 的移植条件 A SM , S- C P U . H 、OS_ C F G . H 和 O 对 N C/ OS2 I 进行移植时, 必须满足

使用keilMDK为ARM9移植uCOSII

使用keilMDK为ARM9移植uCOSII

使用keilMDK为ARM9移植uCOSII作者:吴少风声明:文中内容仅为个人观点,欢迎讨论。

1. 前言ARM9是ARM推出较早的经典处理器,已经积累了大量的应用。

uCOS是流行的开源的实时操作系统(RTOS),可以从uCOS官网获取源码。

KeilMDK是ARM 官方的集成开发环境(IDE),用以支持ARM内核的不同制造商的芯片,其界面简单,功能强大,使用方便,而且持续更新,文档详尽。

ARM9可以运行linux操作系统,但开发相对复杂,且实时性较低。

为ARM9移植uCOS操作系统,提供了一种简单的、实时的操作系统方案。

目前,在keilMDK下,已经有大量ARM Cortex-M核心的uCOS移植案例。

而ARM9的嵌入式开发,包括bootloader和系统移植等,还有很多使用ADS开发环境。

但ADS支持和更新落后,使用相当不方便。

本文使用keilMDK替换落后的ADS,为项目带来了方便。

对业内更多其它的ARM9开发项目,也多一条方法借鉴。

uCOS的参考资料,是邵贝贝翻译的《嵌入式实时操作系统uC_OS-II》,以及uCOS官方文档号为AN1014的应用笔记。

因为要和CPU寄存器组打交道,移植前还需要找到:S3C2440芯片用户手册,ARM构架参考手册。

编译器所需帮助,可以在其帮助菜单中查看超文本文档,方便且详尽。

本文侧重于移植工作,读者在移植之前,应该已经熟悉keilMDK环境,这在网上有一大堆资料。

而且使用keilMDK在实际硬件上做过GPIO、中断、定时器的实验,因为移植时也需要做这些工作。

这些都很简单,建立一个工程,不用修改提示拷贝过来的对应汇编启动文件就可完成。

同时手头还有一些辅助调试的手段,比如串口工具、开发板上的屏幕显示,这些可以确保遇到问题有更多的调试手段。

移植uCOS的代码调试,只使用IDE的模拟器(project option->debug->using simulator)也可以完成调试。

如何从51单片机转到linux嵌入式开发

如何从51单片机转到linux嵌入式开发

如何从51‎单片机转到‎l inux‎嵌入式开发‎首先从st‎m32f4‎07,买个开发板‎,学习液晶怎‎么驱动,点亮像素和‎填充矩形的‎函数(也就是液晶‎的最底层驱‎动函数)怎么写,触摸中断处‎理函数,触摸校正及‎去抖滤波算‎法怎么写,再学sd卡‎u sb口s‎r am、flash‎(也就是st‎m32的f‎s mc 静态‎存储器扩展‎接口)怎么初始化‎和读写数据‎。

这里要指出‎,单片机上的‎代码一般都‎是做以下的‎工作,即外设初始‎化,端口初始化‎,端口置1置‎0,以及简单的‎在spi或‎串口上发送‎极少量的字‎节。

而arm会‎涉及到传送‎大量数据和‎文件。

硬件及底层‎驱动代码搞‎清楚以上这‎些就可以了‎。

因为买的a‎r m开发板‎,都带有现成‎的驱动,不用你去写‎,拿来直接用‎就行。

arm更偏‎重于软件,可以说你在‎a rm 开发‎板上做的9‎0%工作都是软‎件,这也是单片‎机转到ar‎m时让很多‎人迷茫的原‎因,有些人去研‎究arm芯‎片的dat‎a shee‎t,stm32‎f407z‎g t6有1‎44引脚,corte‎x-a8有几百‎个引脚,datas‎h eet上‎千页,片上外设很‎多,外设寄存器‎几百个,单靠一个人‎的力量根本‎没发看完,那是给专门‎做驱动的人‎看的,开发板买来‎都是现成的‎,所以说只学‎习一下st‎m32上的‎液晶和sr‎a m读写这‎样简单的就‎可以,corte‎x-a8上的就‎不用学了,直接拿来主‎义。

我们把主要‎精力放在软‎件上。

接下来开始‎,在stm3‎2上学uc‎g ui移植‎,调用其中函‎数,做一个简单‎界面。

再接下来学‎u cos ii,把这个最基‎本的操作系‎统搞透,需要花大量‎精力和时间‎,不要怕费劲‎,他是一劳永‎逸的,之后在ar‎m a8上用l‎i nux 操‎作系统,就会非常容‎易上手,否则直接学‎l inux‎相当难啃。

移植uco‎s,添加任务,运行成功后‎,接下来学习‎文件系统移‎植,能读U盘中‎的图片,并显示到液‎晶上。

ucos ii移植过程详解

ucos ii移植过程详解

uCOS-II移值过程实例讲解我将uCOS-II 移植到了EPONS 的C33209的平台上,接下来我就基于我移植好的代码讲解如何将uCOS-II从一种MCU移植到另一种MCU。

首先介绍uCOS-II的文件,如下表:ucos_ii.hos_cfg.hos_cpu.hos_core.cos_dbg_r.cos_flag.cos_mbox.cos_mem.cos_mutex.cos_q.cos_sem.cos_task.cos_time.cucos_ii.cos_cpu_c.cos_cpu_a.asm其中我们和硬件平台相关的文件的文件名被加粗了,也就是说若要将uCOS-II移植到新的平台上只要关心被以上四个文件就行了。

当然你也可以根据需要再添加你自己的和平台相关的文件,事实上我也是这么做的。

在我移植的例子中就添加了四个和平台相关的文件,文件如下表:crt0.cdrv_rtc.cvector.cext.scrt0.c是用来初始化系统的比如说MCU的一些特殊寄存器、设置外围的总线接口,等。

drv_rtc.c是用来初始化系统中的一个RTC的,这个RTC可以为内核提供必要的基于时间片调度的时基。

同时提供了对RTC开始和停止的操作函数。

在我的例子中RTC会每秒产生32次中断。

vector.c顾名思义,它是系统上电后为系统提供矢量入口表的文件,当然也包括中断向量表。

ext.s是为uc/OS-II 提供OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()函数的具体实现以及在用户程序的中断函数出入时要调用的状态保护和状态恢复函数OS_SA VEALL ()和OS_RESTOREALL ()。

前面两个函数的功能是:OS_ENTER_CRITICAL()屏蔽中断;OS_EXIT_CRITICAL()恢复原来的中断使能状态。

1. os_cpu_a.asm的说明要想顺利的移植首先要了解uCOS-II的一些基本概念。

嵌入式实时操作系统ucosii

嵌入式实时操作系统ucosii

医疗电子
ucosii在医疗电子领域 中应用于医疗设备、监
护仪、分析仪等。
物联网
ucosii在物联网领域中 应用于传感器节点、网
关、路由器等设备。
02
ucosii的体系结构与内核
任务管理
任务创建
ucosii提供了创建新任务的函数,如 OSTaskCreate(),用于创建新任务。
任务删除
ucosii提供了删除任务的函数,如 OSTaskDelete(),用于删除不再需要的任 务。
时间管理
01
02
03
时间节拍
ucosii通过定时器产生固 定时间间隔的节拍信号, 用于任务调度和时间管理 。
超时处理
ucosii支持超时机制,当 某个任务等待时间超过预 定阈值时触发相应的处理 函数。
时间函数
ucosii提供了一系列时间 函数,如OSTimeDly()、 OSTimeTick()等,用于时 间相关的操作和控制。
智能家居
ucosii适用于智能家居领域,可应用于 智能家电控制、家庭安全监控等场景。
02
03
医疗电子
ucosii适用于医疗电子领域,如医疗设 备控制、病人监控等,其可靠性和实 时性为医疗系统提供了有力保障。
THANKS。
应用软件的开发
任务管理
在UCOSII中,任务是用来实现应用程序功能的。在进行应用软件的开发时,需要创建和管理任务。这包括任务的创 建、删除、挂起和恢复等操作。
任务间通信
为了实现任务间的协同工作,需要进行任务间通信。UCOSII提供了信号量、消息队列、互斥量等机制来实现任务间 通信。在进行应用软件的开发时,需要利用这些机制来实现任务间的同步和数据交换。

COS-II原理及应用

COS-II原理及应用
μC/OS-II原理及应用
μC/OS-II简介 工作原理 μC/OS-II移植简介 μC/OS-II使用初步
周立功单片机
μC/OS-II原理及应用
μC/OS-II简介 工作原理 μC/OS-II移植简介 μC/OS-II使用初步
周立功单片机
μC/OS-II简介
• 概述
μC/OS-II读做“micro C O S 2”,意为“微控制器操 作系统版本2”。μC/OS-II是源码公开的著名实时内 核,可用于各类8位、16位和32位单片机或DSP。从 μC/OS算起,该内核已有10多年应用史,在诸多领域 得到广泛应用。 μC/OS-II是一个完整的、可移植、可固化、可剪 裁的占先式实时多任务内核。μC/OS-II使用ANSI C语 言编写,包含一小部分汇编代码,使之可以供不同架 构的微处理器使用。至今,从8位到64位,μC/OS-II 已在超过40种不同架构的微处理器上运行。
时间管理 信号量 邮箱 内存管理 数据队列
任务1
产生系 统运作 所必需 的节拍
任务2
...
空闲任务
调度程序对 所有任务进 行运行控制
操作系统调度程序
CPU资源
周立功单片机
• 多任务系统工作原理
时间管理 信号量 邮箱 内存管理 数据队列
任务1
0
任务2
1
...
...
空闲任务
n
最多支持64个任务; 个任务 空闲任务一定存在,当所有任务都不运行时才运行空闲任务; 空闲任务一定存在 所有任务都有不同的优先级,优先级为0表示最高,空闲任务 所有任务都有不同的优先级 优先级最低; 任务之间的通信通过ucos提供的各种事件机制进行。
作 者 及 其 著 作

uCOS-II嵌入式操作系统介绍与移植

uCOS-II嵌入式操作系统介绍与移植

OSStartHighRd
1、该函数是在OSStart函数中调用 2、负责从最高优先级任务的TCB中获得该任务的堆
栈指针sp,并依次将cpu现场恢复,这时系统就将 控制权交给用户创建的该任务进程,直到该任务被 阻塞或者被其他更高优先级的任务抢占cpu 3、该函数仅在多任务启动时被执行一次,用来启 动之前创建的第一个,也就是最高优先级的任务执 行
3、可从网站上获 得全部源码及其在各种体系结构平 台上的移植范例。
uC/OS-II特点
1、uC/OS-II内核具有可抢占的实时 多任务调度功能
2、提供了许多系统服务,如信号量、 消息队列、邮箱、内存管理、时间 函数等
3、这些功能可以根据不同的需求进 行裁减。
uC/OS-II的移植
ARM处理器相关宏定义
1、退出临界区
#defineOS_ENTER_CRITICAL() ARMDisableInt()
2、进入临界区
#defineOS_EXIT_CRITICAL() ARMEnableInt()
堆栈增长方向
1、堆栈由高地址向低地址增长,这个也 是和编译器有关的,当进行函数调用时, 入口参数和返回地址一般都会保存在当 前任务的堆栈中,编译器的编译选项和 由此生成的堆栈指令就会决定堆栈的增 长方向。
#define OS_STK_GROWTH 1
OS_CPU.c的移植
1、任务堆栈初始化 2、系统hook函数 3、中断级任务切换函数
任务堆栈初始化OSTaskStkInit
1、由OSTaskCreate或OSTaskCreateExt调用 2、用来初始化任务的堆栈并返回新的堆栈指针stk。
退出/进入临界区函数 ARMDisableInt/ARMEnableInt

使用KEIL提供的PACK包,快速建立ucos系统的移植-

使用KEIL提供的PACK包,快速建立ucos系统的移植-

KEIL最新版本提供了UCOS的代码并完成了底层的移植.只需要借助PACK包并简单的配置即可快速完成UCOS的移植.1.新建功能,并在Manage Run-Time Environment总如下设置.点击该按钮,出现如下画面.勾选如下内容.a.CMSIS CORE.改选想提供了你所选择的CPU的底层支持,本质是增加了"core_cm0.h"文件的包含路径.如果5.18a版本非覆盖安装,该选择必须选择,否则找不到上述头文件.b.勾选Device中的Startup及Driver中你会用到的外设.选中以上内容后在工程目录中增加以下文件.c.在RTOS中选择Micrium,做如图勾选及选择.选择后工程中多出以下文件.带钥匙的是只读文件,不需要修改,不带钥匙的是可以修改的文件.不带钥匙的文件问OS配置文件.2.复制os-cpu及os-port文件到工程目录.a.在功能目录下新建os-cpu及os-port文件夹.相关文件在keil中已经做好了移植,但是不能加到工程中,所以手动复制,添加一下.快速查找方法,打开任意一个OS文件,这里打开的是os_flag.c.右击编辑区该文件的名称,选择最后一项,打开文件所在目录.向上选择文件夹,进入如下目录,复制文件至工程中的os-port文件夹.进入如下目录,复制文件到工程中的os-cpu文件夹为了方便管理HOOK函数,借鉴ucosiii的方法将如下文件复制到工程目录的os-port中,只复制选中文件即可b.将以上.C文件加入工程,将以上.H文件的目录包含进keil.具体操作自己百度.3.编译文件,解决错误.a.编译一下,发现两个错误.如下图.双击错误,将错误报警的行注释掉.两个文件都是只读属性,修改两个文件需要到文件中,将文件的只读属性去掉.对于第一个错误,由于文件是从ucosiii中借用的,ucosii中没有该头文件.所以注释掉.ucosii是在其他头文件声明的这几个函数.对于第二个错误,阅读代码发现无该变量.不知道为何出现该行,故注释掉.b.继续编译,发现出现了一堆错误.错误的类型都是函数在os_dbg_r.c和os_dbg.c中重复出现.如下图,选中的和鼠标出的文件.由于os_dbg_r.c是直接带的,所以只能讲os_dbg.c移除.c.继续编译,发现如下错误.该错误是未定义main函数,这个以后以后处理.事实上该系统的移植还有两个问题没有解决,并且这个问题编译时没有提示,只有程序调试时才会发现系统根本无法运行.这个是系统提供的startup文件,选中的部分是两个中断向量及其调用的函数的声明.SysTick_Handler大家知道ucos使用该中断产生时钟节拍.PendSV_Handler是ucos针对M核心单片机的特性设计的上下文切换(任务切换)使用的中断.(具体机制可以百度搜索)而在ucos中看看两个函数如何定义的.os_cpu_c.c中os_cpu_a.asm中名称改成相同.。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(5)移植串口驱动程序
在此之前我写过基于中断的串口驱动程序,包括打印字节/字/长字/字符串,读串口,初始化串口/缓冲区。把它改成重入函数即可直接使用。
系统提供的显示函数是并发的,它不是直接显示到串口,而是先输出到显存,用户不必担心IO慢速操作影响程序运行。串口输入也采用了同样的技术,他使得用户在CPU忙于处理其他任务时照样可以盲打输入命令。
任务切换时,先保存当前任务堆栈内容。方法是:用SP-OSStkStart得出保存字节数,将其写入用户堆栈最低地址内,以用户堆栈最低地址为起址,以OSStkStart为系统堆栈起址,由系统栈向用户栈拷贝数据,循环SP-OSStkStart次,每次拷贝前先将各自栈指针增1。
其次,恢复最高优先级任务系统堆栈。方法是:获得最高优先级任务用户堆栈最低地址,从中取出“长度”,以最高优先级任务用户堆栈最低地址Байду номын сангаас起址,以OSStkStart为系统堆栈起址,由用户栈向系统栈拷贝数据,循环“长度”数值指示的次数,每次拷贝前先将各自栈指针增1。
AAAAAA111111 is active
AAAAAA111111 is active
BBBBBB333333 is active
AAAAAA111111 is active
AAAAAA111111 is active
AAAAAA111111 is active
BBBBBB333333 is active
CCCCCC666666 is active
AAAAAA111111 is active
AAAAAA111111 is active
AAAAAA111111 is active
BBBBBB333333 is active
AAAAAA111111 is active
AAAAAA111111 is active
最后还有几点必须注意的事项。本来原则上我们不用修改与处理器无关的代码,但是由于KEIL编译器的特殊性,这些代码仍要多处改动。因为KEIL缺省情况下编译的代码不可重入,而多任务系统要求并发操作导致重入,所以要在每个C函数及其声明后标注reentrant关键字。另外,“pdata”、“data”在uCOS中用做一些函数的形参,但它同时又是KEIL的关键字,会导致编译错误,我通过把“pdata”改成“ppdata”,“data”改成“ddata”解决了此问题。OSTCBCur、OSTCBHighRdy、OSRunning、OSPrioCur、OSPrioHighRdy这几个变量在汇编程序中用到了,为了使用Ri访问而不用DPTR,应该用KEIL扩展关键字IDATA将它们定义在内部RAM中。
(2)中断会引发条件变化,在退出前必须进行任务调度。uCOSII要求中断的堆栈结构符合规范,以便正确协调中断退出和任务切换。前面已经说到任务切换实际是模拟一次中断事件,而在真正的中断里省去了模拟(本身就是中断嘛)。只要规定中断堆栈结构和uCOSII模拟的堆栈结构一样,就能保证在中断里进行正确的切换。任务切换发生在中断退出前,此时还没有返回中断断点。仔细观察中断程序和切换程序最后两句,它们是一模一样的,POPALL+RETI。即要么直接从中断程序退出,返回断点;要么先保存现场到TCB,等到恢复现场时再从切换函数返回原来的中断断点(由于中断和切换函数遵循共同的堆栈结构,所以退出操作相同,效果也相同)。用户编写的中断子程序必须按照uCOSII规范书写。任务调度发生在中断退出前,是非常及时的,不会等到下一时间片才处理。OSIntCtxSw()函数对堆栈指针做了简单调整,以保证所有挂起任务的栈结构看起来是一样的。
(3)在uCOSII里,任务必须写成两种形式之一(《uCOSII中文版》p99页)。在有些RTOS开发环境里没有要求显式调用OSTaskDel(),这是因为开发环境自动做了处理,实际原理都是一样的。uCOSII的开发依赖于编译器,目前没有专用开发环境,所以出现这些不便之处是可以理解的。
移植过程:
结语:μC/OS-II具有免费、简单、可靠性高、实时性好等优点,但也有缺乏便利开发环境等缺点,尤其不像商用嵌入式系统那样得到广泛使用和持续的研究更新。但开放性又使得开发人员可以自行裁减和添加所需的功能,在许多应用领域发挥着独特的作用。当然,是否在单片机系统中嵌入μC/OS-II应视所开发的项目而定,对于一些简单的、低成本的项目来说,就没必要使用嵌入式操作系统了。
引言:随着各种应用电子系统的复杂化和系统实时性需求的提高,并伴随应用软件朝着系统化方向发展的加速,在16位/32位单片机中广泛使用了嵌入式实时操作系统。然而实际使用中却存在着大量8位单片机,从经济性考虑,对某些应用场合,在8位MCU上使用操作系统是可行的。从学习操作系统角度,uC/OS-II for 51即简单又全面,学习成本低廉,值得推广。
(3)改写OS_CPU_C.C
我设计的堆栈结构如下图所示:
TCB结构体中OSTCBStkPtr总是指向用户堆栈最低地址,该地址空间内存放用户堆栈长度,其上空间存放系统堆栈映像,即:用户堆栈空间大小=系统堆栈空间大小+1。
SP总是先加1再存数据,因此,SP初始时指向系统堆栈起始地址(OSStack)减1处(OSStkStart)。很明显系统堆栈存储空间大小=SP-OSStkStart。
(4)重写OS_CPU_A.ASM
A51宏汇编的大致结构如下:
NAME 模块名 ;与文件名无关
;定义重定位段 必须按照C51格式定义,汇编遵守C51规范。段名格式为:?PR?函数名?模块名
;声明引用全局变量和外部子程序 注意关键字为“EXTRN”没有‘E’
全局变量名直接引用
无参数/无寄存器参数函数 FUNC
AAAAAA111111 is active
BBBBBB333333 is active
CCCCCC666666 is active
Demo程序经Keil701编译后,代码量为7-8K,可直接在KeilC51上仿真运行。
编译时要将OS_CPU_C.C、UCOS_II.C、OS_CPU_A.ASM、YY.C加入项目
用户堆栈初始化时从下向上依次保存:用户堆栈长度(15),PCL,PCH,PSW,ACC,B,DPL,DPH,R0,R1,R2,R3,R4,R5,R6,R7。不保存SP,任务切换时根据用户堆栈长度计算得出。
OSTaskStkInit函数总是返回用户栈最低地址。
操作系统tick时钟我使用了51单片机的T0定时器,它的初始化代码用C写在了本文件中。
;定义宏
宏名 MACRO 实体 ENDM
;子程序
OSStartHighRdy
OSCtxSw
OSIntCtxSw
OSTickISR
SerialISR
END ;声明汇编源文件结束
一般指针占3字节。+0类型+1高8位数据+2低8位数据 详见C51.PDF第178页
低位地址存高8位值,高位地址存低8位值。例如0x1234,基址+0:0x12 基址+1:0x34
uCOSII工作核心原理是:近似地让最高优先级的就绪任务处于运行状态。
操作系统将在下面情况中进行任务调度:调用API函数(用户主动调用),中断(系统占用的时间片中断OsTimeTick(),用户使用的中断)。
调度算法书上讲得很清楚,我主要讲一下整体思路。
(1)在调用API函数时,有可能引起阻塞,如果系统API函数察觉到运行条件不满足,需要切换就调用OSSched()调度函数,这个过程是系统自动完成的,用户没有参与。OSSched()判断是否切换,如果需要切换,则此函数调用OS_TASK_SW()。这个函数模拟一次中断(在51里没有软中断,我用子程序调用模拟,效果相同),好象程序被中断打断了,其实是OS故意制造的假象,目的是为了任务切换。既然是中断,那么返回地址(即紧邻OS_TASK_SW()的下一条汇编指令的PC地址)就被自动压入堆栈,接着在中断程序里保存CPU寄存器(PUSHALL)……。堆栈结构不是任意的,而是严格按照uCOSII规范处理。OS每次切换都会保存和恢复全部现场信息(POPALL),然后用RETI回到任务断点继续执行。这个断点就是OSSched()函数里的紧邻OS_TASK_SW()的下一条汇编指令的PC地址。切换的整个过程就是,用户任务程序调用系统API函数,API调用OSSched(),OSSched()调用软中断OS_TASK_SW()即OSCtxSw,返回地址(PC值)压栈,进入OSCtxSw中断处理子程序内部。反之,切换程序调用RETI返回紧邻OS_TASK_SW()的下一条汇编指令的PC地址,进而返回OSSched()下一句,再返回API下一句,即用户程序断点。因此,如果任务从运行到就绪再到运行,它是从调度前的断点处运行。
(6)编写测试程序Demo(YY.C)
Demo程序创建了3个任务A、B、C优先级分别为2、3、4,A每秒显示一次,B每3秒显示一次,C每6秒显示一次。从显示结果看,显示3个A后显示1个B,显示6个A和2个B后显示1个C,结果显然正确。
显示结果如下:
AAAAAA111111 is active
带寄存器参数函数 _FUNC
重入函数 _?FUNC
;分配堆栈空间
只关心大小,堆栈起点由keil决定,通过标号可以获得keil分配的SP起点。切莫自己分配堆栈起点,只要用DS通知KEIL预留堆栈空间即可。
?STACK段名与STARTUP.A51中的段名相同,这意味着KEIL在LINK时将把两个同名段拼在一起,我预留了40H个字节,STARTUP.A51预留了1个字节,LINK完成后堆栈段总长为41H。查看yy.m51知KEIL将堆栈起点定在21H,长度41H,处于内部RAM中。
EA=0关中断;EA=1开中断。这样定义即减少了程序行数,又避免了退出临界区后关中断造成的死机。
相关文档
最新文档