⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtos.s43

📁 一个MSP430单片机的实时操作系统的框架程序
💻 S43
📖 第 1 页 / 共 2 页
字号:
;========================================================================================
;
;                             实时多任务操作系统源代码
;
;                                 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 + -