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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wowocpp/article/details/83090375

嵌入式实时操作系统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.

在这里插入图片描述

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

在这里插入图片描述

(以后补充)

猜你喜欢

转载自blog.csdn.net/wowocpp/article/details/83090375