📄 rtos.s43
字号:
;========================================================================================
;
; 实时多任务操作系统源代码
;
; M430/OS V1.21
;
;
; 文件名:rtos.s43
;
; 作 者:刘兵 public_rtos@163.com 2002年11月27日
;
;----------------------------------------------------------------------------------------
;
; 注 释:
;
; 本操作系统用的是抢占先式内核,如果一个优先级比较低的任务正在运行,另一个优先级高的
; 任务就绪时,系统就把优先级低的任务的现场保存,再切到优先级高的任务运行;优先级高的
; 任务运行完之后,再切到优先级低的任务的断点处继续执行。
;
;----------------------------------------------------------------------------------------
;
; 每个任务必须是以下结构:
;
; /--------------\
; ( 开 始 )
; \--------------/
; |
; V
; |----------------------|
; | 任务本身数据初始化 |
; |----------------------|
; |
; |<-------------------------\
; | |
; V |
; |------------------| |
; | 任务执行代码 | |
; |------------------| |
; | |
; V |
; |----------------------------------------| |
; | 调用OS_Time_Dly进行延时,这时系统会 | |
; | 把延时的这段时间切到其它任务来运行 | |
; |----------------------------------------| |
; | |
; \--------------------------/
;
;
; 每个任务都是一个无限循环,只有开始,没有结束。
;
;----------------------------------------------------------------------------------------
;
; 本操作系统包括9个函数:
;
; 1. OS_Init
; 功能:初始化M430/OS的系统数据。
;
; 2. OS_Create
; 功能:建立任务。
;
; 3. OS_Start
; 功能:启动M430/OS。
;
; 4. OS_Sched
; 功能:进行任务调度、任务切换。
;
; 5. OS_Time_Dly
; 功能:任务延时函数。
;
; 6. OS_Free_Task
; 功能:空闲任务。
;
; 7. OS_Task_Lock
; 功能:禁止任务调度。
;
; 8. OS_Task_Unlock
; 功能:允许任务调度。
;
; 9. OS_Task_Wakeup
; 功能:唤醒指定优先级的任务
;
;
;
;========================================================================================
NAME rtos(16)
RSEG DATA16_N(1)
RSEG DATA16_I(1)
RSEG DATA16_Z(1)
RSEG DATA16_C(1)
RSEG CODE(1)
COMMON INTVEC(1)
#include <msp430x14x.h>
#define OS_FREE_FLAG BIT0
#define OS_DEC_FLAG BIT1
#define OS_TASK_LOCK BIT2
#define OS_ClockSync BIT3
Task_Count DEFINE 4 //任务数目
Task_Data_Count DEFINE 6 //每个任务要保存的现场数目(单位:字)
CORRENT_DATA_LENGTH DEFINE Task_Data_Count*2 ;现场数据长度
#define TASK_BASE 0 //任务入口址
#define STACK_BASE 2 //堆栈基址
#define STACK_POINT 4 //堆栈指针
#define TIME_TICK 6 //时钟嘀嗒
#define STACK_SIZE 8 //堆栈大小
PUBLIC OS_Init
PUBLIC OS_Sched
PUBLIC OS_Time_Dly
PUBLIC OS_Task_Lock
PUBLIC OS_Task_Unlock
PUBLIC OS_Task_Wakeup
PUBLIC OS_Task_Wakeup_I
PUBLIC Task_Flag
PUBLIC OS_Task_Create
PUBLIC OS_Start
PUBLIC RTOS_Initlize
Task0_Stack_Size DEFINE 15
Task1_Stack_Size DEFINE 15
Task2_Stack_Size DEFINE 15
Task3_Stack_Size DEFINE 15
EXTERN Task0
EXTERN Task1
EXTERN Task2
EXTERN Task3
RSEG CODE
;------------------------------------------------
RTOS_Initlize
;C语言接口的“初始化所有的函数”
;在C语言中调用方式:RTOS_Initlize();
;------------------------------------------------
mov.w #(WDTPW+WDTHOLD),&WDTCTL ;在debug版本下把看门狗禁止掉,debug版本可以单步执行
call #OS_Init
mov.w #Task0_Info,r12
call #OS_Task_Create ;建立Task0任务
mov.w #Task1_Info,r12
call #OS_Task_Create ;建立Task1任务
mov.w #Task2_Info,r12
call #OS_Task_Create ;建立Task2任务
mov.w #Task3_Info,r12
call #OS_Task_Create ;建立Task3任务
ret
;------------------------------------------------
OS_Task_Create
;功能:建立新任务。
;参数:任务TCB结构:
; unsigned int *task_base; //任务入口
; unsigned int *stack_base; //任务堆栈基址
; unsigned int *stack_point; //任务堆栈指针的位置
; unsigned int *time_tick; //任务时钟嘀嗒数的位置
; unsigned int stack_size; //堆栈大小
;调用方式:
; push.w #Task_TCB
; call #OS_Task_Create
; incd.w sp
;
;任务堆栈示意图
;
; ^ | |
; | |-----------| //栈顶(低地址)
; | | . |
; | | . |
; | | 栈区 |
; | | . |
; | | . |
; | |-----------| //堆栈指针
; | | . |
; | | . |
; | | 现场数据 |
; | | . |
; | | . |
; | |-----------|
; | |标志寄存器 |
; | |-----------|
; | | 断点 |
; | ------------- //栈底(高地址)
;
;
;本函数共有18行代码
;------------------------------------------------
push.w r10
push.w r11
mov.w r12,r10 ;取出结构指针
mov.w STACK_BASE(r10),r11 ;取出结构指针指向的堆栈基址(栈顶)
add.w STACK_SIZE(r10),r11 ;找到栈底
mov.w TASK_BASE(r10),-2(r11) ;任务首地址做为断点放入栈底
mov.w sr,-4(r11)
bis.w #GIE,-4(r11) ;标志寄存器放入栈底
mov.w TIME_TICK(r10),r10
clr.w 0(r10) ;清0此任务的时钟嘀嗒数
mov.w r12,r10
mov.w STACK_POINT(r10),r10
mov.w r11,0(r10)
sub.w #CORRENT_DATA_LENGTH+4,0(r10) ;堆栈指针
inc.w Free_Count
pop.w r11
pop.w r10
ret
;------------------------------------------------
OS_Start
;多任务动函数
;功能:初始化定时器TimeA0、空闲任务,启动最高优先级的任务。
;参数:无
;反值:无
;本函数有14行代码
;------------------------------------------------
bis.w #(TASSEL1+TACLR+MC_1),&TACTL
mov.w r12,&CCR0
bis.w #CCIE,&CCTL0 ;初始化TimerA0
mov.w #OS_Free_Task,2(sp)
mov.w sr,0(sp)
bis.w #GIE,0(sp)
decd.w sp
mov.w sp,free_task_stack_point
clr.w free_task_time_tick ;初始化空闲任务
cmp.w #Task_Count,Free_Count
jnz ERROR_USER_PROGRAM ;任务个数是否够,如果不够就死机或不断复位
clr.w Free_Count
clr.w r10
jmp OS_Sched_jmp02
;------------------------------------------------
PUBLIC
OS_Init
;功能:初始多任务数据
;调用方法:call #OS_Init
;本函数共有4行代码
;------------------------------------------------
clr.w Current_Task
clr.w Task_Flag
clr.w Free_Count
ret
;------------------------------------------------
PUBLIC
OS_Time_Dly
;功能:多任务延时,延时单位是时钟滴嗒数
;调用方法:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -