嵌入式实时操作系统small RTOS51原理及应用 ----笔记 第五章 如何任务切换

嵌入式实时操作系统small RTOS51原理及应用 ----笔记 第五章 如何任务切换

在这里插入图片描述

5.3 何时进行任务切换

参考书籍<MCS-51单片机原理与应用.pdf>

	TMOD = (TMOD & 0XF0) | 0X01;
	TL0 = 0x0;
	TH0 = 0x0;
	TR0 = 1;
	ET0 = 1;

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

OSStart 解析

extern idata uint8 STACK[1];                    /* 堆栈起始位置,在OS_CPU_A定义 */

在这里插入图片描述

#define IDATA_RAM_SIZE 0x100 /* idata大小 */
0x100 = 256

在这里插入图片描述

uint8 idata * data OSTsakStackBotton[OS_MAX_TASKS + 2];/* 任务堆栈底部位置 */

sfr SP = 0x81;

p++等价于:先处理p,然后在执行p++;举个列子(伪代码)

片内 RAM 的寻址范围:普通型128B(00H~7FH)、增强型256B(00H~FFH)。

D:0088H PUBLIC TCON
B:00A8H.1 PUBLIC ET0
D:008CH PUBLIC TH0
D:008AH PUBLIC TL0
C:03F4H PUBLIC TaskA
B:0088H.4 PUBLIC TR0
C:03FEH PUBLIC TaskB
C:0408H PUBLIC TaskC
D:00C8H PUBLIC T2CON
D:00D0H PUBLIC PSW

idata ----- RAM 区的高128B,必须采用间接寻址

C:0424H PUBLIC OSIdle
D:0081H PUBLIC SP

http://www.keil.com/dd/chip/2980.htm

在这里插入图片描述

在这里插入图片描述

KEIL之调试查看ROM或RAM

则右下角出现Memory1的页面,默认出现的是ROM的查看界面,在Address一栏输入十六进制的地址即可查看ROM里面的数值。

点击Memory Windows按键右边黑三角选择Memory2,则在右下角出现Memory2的标签页面,在Address一栏输入D:20H,代表查看RAM中20H中的数值。
在这里插入图片描述

Ctrl+F5或点击调试按钮进入调试界面:

汇编代码解析:

    MOV     A,#OS_MAX_TASKS
    XRL     A,OSTaskID   ----- 异或  相同为0 ,相异为1
    JNZ     OSIntCtxSw_0  ------ 若累加器的值不为0,则跳到rel所对应的目的地址
                                        ;是则不需要保存所有寄存器
;SP=SP-13-4                             ;4:两层函数调用堆栈,13:寄存器数目
    MOV     A,#(-17)
    ADD     A,SP
    MOV     SP,A
                                        ;跳转到OSCtxSw,同时通知CPU中断处理完成
    MOV	    A, #LOW  OSCtxSw
    PUSH    ACC
    MOV	    A, #HIGH OSCtxSw
    PUSH    ACC
    RETI
                                        ;需要保存所有寄存器
OSIntCtxSw_0:
;SP=SP-4                                ;4:两层函数调用堆栈
    MOV     A,#0FCH               ;将立即数0FCH 存放到累加器中
    ADD     A,SP						;
    MOV     SP,A
                                        ;设置标志:任务再次恢复运行时需要恢复所有寄存器
    MOV     DPTR,#OSMapTbl
    MOV     A,OSTaskID
#if OS_MAX_TASKS < 9
    MOVC    A,@A+DPTR
    CPL     A
    ANL     A,OSFastSwap
    MOV     OSFastSwap,A    
#else
    CLR     C
    SUBB    A,#8
    JC      OSIntCtxSw_1    
    MOVC    A,@A+DPTR
    CPL     A    
    ANL     A,OSFastSwap
    MOV     OSFastSwap,A 
    SJMP    OSIntCtxSw_2
OSIntCtxSw_1:
    MOV     A,OSTaskID
    MOVC    A,@A+DPTR
    CPL     A    
    ANL     A,OSFastSwap+1
    MOV     OSFastSwap+1,A 
OSIntCtxSw_2:
#endif
                                        ;跳转到堆栈处理,同时通知CPU中断处理完成
    MOV	    A, #LOW  C_OSCtxSw
    PUSH    ACC
    MOV	    A, #HIGH C_OSCtxSw
    PUSH    ACC
    RETI

;****************************************************************************************
	END


汇编语法

MOV dst src
MOV 目的 源

逻辑异或(XRL):

HIGH

LOW
称为字节分离操作符,它接收一个数或地址表达式,
HIGH取其高位字节,LOW取其低位字节

MOVC A,@A+DPTR
将累加器的值加上数据指针寄存器的值,
为指定程序存储器地址的内容读入到累加
器中

CPL bit
将直接位地址的内容取反

CPL C
将位累加器C的值取反

#if OS_MAX_TASKS < 9
uint8 data OSFastSwap = 0xff; /* 任务是否可以快速切换 */
#else
uint16 data OSFastSwap = 0xffff;
#endif

搭建使用 RTX51-Tiny 的 C51 Keil 项目环境
https://blog.csdn.net/Airbnb/article/details/41692353?utm_source=blogxgwz4

  1. 51栈向上增长,ARM和MIPS向下增长

  2. 51寄存器是直接寻址,内存是间接寻址。寄存器的0x80-0xff和内存的0x80-0xff一致,但物理单元不同。

  3. const定义的变量还是在data memory。如果要定义到ROM必须要用code

在这里插入图片描述

MCS-51 TM
code Program memory (64 KBytes); accessed by opcode MOVC @A+DPTR.

http://www.keil.com/support/man/docs/c51/c51_le_memtypes.htm

在这里插入图片描述

Easy51RTOS入门级初略分析
http://www.keil.com/support/man/docs/tr51/tr51_reentrant.htm
Reentrant Functions
The C51 Compiler provides support for reentrant functions. Reentrant functions store parameters and local variables on a reentrant stack. This protects them from recursive or simultaneous calls. RTX51 Tiny does not contain any management for the C51 reentrant stack. So, if you use reentrant functions in your application, you must ensure that these functions do not call any RTX51 Tiny system functions and that reentrant functions are not interrupted by round-robin task switching.

C functions, which use only registers for parameter and automatic variables, are inherently reentrant and may be called without any restrictions from RTX51 Tiny.

Non-reentrant C functions may not be called from more than one task or interrupt procedure. Non-reentrant C51 functions store their parameters and automatic variables (local data) in static memory segments which may be overwritten when the function is called from multiple tasks simultaneously or recursively.

You may invoke non-reentrant functions from multiple tasks if you ensure that they are not called recursively (simultaneously). Usually this means that round-robin task scheduling must be disabled and that your non-reentrant functions may not call any RTX51 Tiny system functions.

Note

You should disable Round-Robin Task Switching if you wish to invoke reentrant or non-reentrant function from more than one task or interrupt.

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(以后补充)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 嵌入式实时操作系统(RTOS)是一种专门为嵌入式系统设计的操作系统,它具有实时性、可靠性、高效性等特点。RT-Thread是一款开源的嵌入式实时操作系统,它采用了轻量级的内核设计,支持多种处理器架构和多种外设驱动,具有灵活的可扩展性和易用性。RT-Thread的设计和实现涉及到内核、任务调度、内存管理、设备驱动、文件系统等多个方面,需要深入理解嵌入式系统的原理和技术。 ### 回答2: 嵌入式实时操作系统(Real-Time Operating System,RTOS)是指专门为嵌入式系统设计的操作系统,它具有小巧、高效、可靠等特点。其中,rt-thread是一个轻量级、开源、可裁剪的实时操作系统内核,其设计简单、可靠性高、实时性好、灵活性强、可移植性强等特点,被广泛应用于各种嵌入式系统中。 rt-thread的设计理念是以线程为中心,支持多线程应用程序的同时,同时支持时钟中断、定时器、信号量、互斥锁、信号、消息队列等机制,使其能够更好地适应实时应用需求。rt-thread采用分层设计,底层由硬件驱动层和操作系统内核层组成,上层可根据应用需求进行定制。rt-thread内核采用模块化设计,不同的模块可以互相独立运行,也可以进行组合和交错。 rt-thread还支持多种调试和优化技术,如GDB、OCD等调试器,并集成了实时性能分析、内存泄漏检测等优化工具。除此之外,rt-thread还提供了工具链、文档、示例程序等支持,方便用户集成和使用。 总的来说,rt-thread是一个高度可定制化、可裁剪、高效、灵活的嵌入式实时操作系统内核,能够满足不同实时应用场景的需求,其应用范围涵盖了智能家居、工业控制、医疗设备、智能交通、消费电子等领域。 ### 回答3: 嵌入式实时操作系统(RTOS)是一种用于嵌入式系统的操作系统,其主要目标是提供实时性、可靠性和高效性。RT-Thread是一种轻量级、开源、可裁剪的RTOS,旨在满足小型嵌入式设备的要求。它支持多任务、软件定时器、线程同步和通信机制,并提供了多种驱动程序和应用程序框架。RT-Thread有着许多优秀的特性,例如快速启动、低占用率、模块化、兼容性、扩展性、可裁剪和易用性等。 RT-Thread的设计基于三大核心要素:线程、事件和信号量。通过这些要素,RT-Thread实现了多任务调度和同步机制。此外,RT-Thread还提供了丰富的IPC机制,包括邮箱、消息队列和信号量等,以便实现线程之间的通信和同步。 RT-Thread的高可裁剪性也是其最大的特点之一。用户可以根据实际需求进行系统裁剪和优化,从而获得最小、最高效的系统。这种裁剪性基于RT-Thread内核代码的高度模块化,为用户提供了方便的系统配置和扩展接口。 RT-Thread的驱动程序也是其核心之一。RT-Thread提供了许多通用设备驱动,例如串口、SPI、I2C、USB、以太网等,方便用户快速实现硬件和软件的整合。 RT-Thread的开发也非常方便,支持多种开发环境和编译器,包括Keil、IAR和GCC等,使开发人员能够在各种平台和系统中进行开发工作。 总之,RT-Thread是一种优秀的嵌入式实时操作系统,具有方便的裁剪性、高效的多任务调度和同步机制、丰富的IPC机制和通用设备驱动程序等特点,非常适合小型嵌入式设备的开发使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值