?? rtos.s43
字號:
;========================================================================================
;
; 實時多任務操作系統源代碼
;
; M430/OS V1.10
;
;
; 文件名:RTOS.S43
;
; 作 者:劉兵 public_rtos@163.com 2002年11月27日
;
;----------------------------------------------------------------------------------------
;
; 注 釋:
;
; 本操作系統用的是搶占先式內核,如果一個優先級比較低的任務正在運行,另一個優先級高的
; 任務就緒時,系統就把優先級低的任務的現場保存,再切到優先級高的任務運行;優先級高的
; 任務運行完之后,再切到優先級低的任務的斷點處繼續執行。
;
;----------------------------------------------------------------------------------------
;
; 每個任務必須是以下結構:
;
; /--------------\
; ( 開 始 )
; \--------------/
; |
; V
; |----------------------|
; | 任務本身數據初始化 |
; |----------------------|
; |
; |<-------------------------\
; | |
; V |
; |------------------| |
; | 任務執行代碼 | |
; |------------------| |
; | |
; V |
; |----------------------------------------| |
; | 調用OS_Time_Dly進行延時,這時系統會 | |
; | 把延時的這段時間切到其它任務來運行 | |
; |----------------------------------------| |
; | |
; \--------------------------/
;
;
; 每個任務都是一個無限循環,只有開始,沒有結束。
;
;----------------------------------------------------------------------------------------
;
; 本操作系統包括7個函數(共86行可執行代碼):
;
; 1. OS_Init
; 功能:初始化多任務環境,然后直接切到優先級最高的任務。
;
; 2. OS_Sched
; 功能:進行任務調度、任務切換。
;
; 3. OS_Time_Dly
; 功能:任務延時函數。
;
; 4. OS_Free_Task
; 功能:空閑任務。
;
; 5. OS_Task_Lock
; 功能:禁止任務調度。
;
; 6. OS_Task_Unlock
; 功能:允許任務調度。
;
; 7. OS_Task_Wakeup
; 功能:喚醒指定優先級的任務
;
;========================================================================================
NAME RTOS(16)
#include <msp430x14x.h>
#include "include.h"
Task_Count DEFINE 06h ;任務數目
Task_Data_Count DEFINE 06h ;每個任務要保存的現場數目(單位:字)
FREE_STACK_SIZE DEFINE (Task_Data_Count+02h)
SOFTCLOCK_STACK_SIZE DEFINE 10h ;軟時鐘任務的堆棧大?。▎挝唬鹤郑?TASK1_STACK_SIZE DEFINE 11h ;任務1的堆棧大小(單位:字)
TASK2_STACK_SIZE DEFINE 12h ;任務2的堆棧大?。▎挝唬鹤郑?TASK3_STACK_SIZE DEFINE 13h ;任務3的堆棧大?。▎挝唬鹤郑?TASK4_STACK_SIZE DEFINE 14h ;任務4的堆棧大?。▎挝唬鹤郑?LED_STACK_SIZE DEFINE FREE_STACK_SIZE+2 ;LED指示燈的堆棧大?。▎挝唬鹤郑?
#include "rtos.h"
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
EXTERN softclock
EXTERN task1
EXTERN task2
EXTERN task3
EXTERN task4
EXTERN taskled
ORG (0a00h - (SYSTEM_RAM_SIZE + TASK_STACK_SIZE))
Current_Task DW 0000h ;當前運行的任務的指針
Task_Flag DW 0000h ;任務狀態(是否允許調度、是否允許計數等)
Free_Count DW 0000h ;空閑任務計數
Task_SP DS (Task_Count*2+2) ;每個任務的堆棧SP指針位置
Task_Tick DS (Task_Count*2+2) ;每個任務的延時計數
DS (TASK_STACK_SIZE) ;任務棧
ORG 0ffech
dw OS_Sched
ORG 3000h
;------------------------------------------------
PUBLIC
OS_Init
;功能:初始多任務數據、環境、任務棧,并啟動最高優先級的任務
;調用方法:call #OS_Init,多任務就啟動開了
;本函數共有26行代碼
;------------------------------------------------
clr.w Current_Task
clr.w Task_Flag
clr.w Free_Count
bis.w #(TASSEL1+TACLR+MC_1),&TACTL
mov.w 2(sp),&CCR0
bis.w #CCIE,&CCTL0
eint
mov.w SR,r13
dint
mov.w #09feh,r11
mov.w #OS_Task_Table,r12
clr.w r10
OS_Init_for01
cmp.w #(Task_Count*2+2),r10
jz OS_Init_endfor01
clr.w Task_Tick(r10) ;清0時鐘滴嗒數
mov.w 0(r12),0(r11) ;把任務地址壓入堆棧
mov.w r13,-2(r11) ;把標志寄存器放入任務棧
mov.w r11,Task_SP(r10)
sub.w #(Task_Data_Count*2+2),Task_SP(r10) ;SP位置放入堆棧
sub.w Stack_Size_Table(r10),r11 ;指向下一個任務
incd.w r12
incd.w r10
jmp OS_Init_for01
OS_Init_endfor01
clr.w Task_Flag
clr.w Current_Task
clr.w Free_Count
mov.w #09feh,sp
eint
ret ;返回到最高優先級的任務
;------------------------------------------------
PUBLIC
OS_Time_Dly
;功能:多任務延時,延時單位是時鐘滴嗒數
;調用方法:
;push.w #延時時間
;call #OS_Time_Dly
;incd.w sp
;本函數共有7行代碼
;------------------------------------------------
push.w SR ;模擬中斷發生
dint
push.w r10
mov.w Current_Task,r10
mov.w 6(sp),Task_Tick(r10) ;把任務延時的滴嗒數存入
bic.w #OS_TASK_LOCK,Task_Flag ;解開任務鎖
br #OS_Sched_endfor01
;------------------------------------------------
PUBLIC
OS_Sched
;功能:任務調度
;本函數共有39行代碼
;------------------------------------------------
push.w r10
#ifndef debug
mov.w #WDTPW+WDTCNTCL,&WDTCTL
#endif
clr.w r10
OS_Sched_for01
cmp.w #(Task_Count*2+1),r10
jge OS_Sched_endfor01
tst.w Task_Tick(r10)
jz OS_Sched_jmp01 ;如果時鐘滴嗒數為0,則不對其進行減1
dec.w Task_Tick(r10) ;對時鐘滴嗒數進行減1
OS_Sched_jmp01
incd.w r10
jmp OS_Sched_for01
OS_Sched_endfor01
bit.w #OS_TASK_LOCK,Task_Flag ;檢查任務鎖是否加上
jnz OS_Sched_exit ;如果任務鎖被加上,則不進行調度
clr.w r10
OS_Sched_for02
cmp.w #(Task_Count*2+3),r10
jge ERROR_USER_PROGRAM
tst.w Task_Tick(r10) ;檢查是否有任務就緒
jz OS_Sched_Task_Switch ;有,則跳轉到任務切換
incd.w r10
jmp OS_Sched_for02
OS_Sched_Task_Switch
cmp.w Current_Task,r10 ;比較就緒任務是不是當前運行的任務
jz OS_Sched_exit ;如果是,轉向下一處
push.w r11
push.w r12
push.w r13
push.w r14
push.w r15 ;保存現場
mov.w Current_Task,r11 ;保存當前任務指針
mov.w sp,Task_SP(r11) ;保存當前任務堆棧指針
mov.w r10,Current_Task ;就緒任務指針保存為當前任務指針
mov.w Task_SP(r10),sp ;堆棧切換
pop.w r15
pop.w r14
pop.w r13
pop.w r12
pop.w r11
OS_Sched_exit
pop.w r10 ;恢復就緒任務現場
reti
;如果用戶程序出錯,則把所有中斷關閉,然后死的此處。此段代碼只是調試時用。
;如果在產品投入應用中,請把此段代碼改為單片機的復位代碼。
ERROR_USER_PROGRAM
#ifdef debug
dint
jmp ERROR_USER_PROGRAM
#else
br 0fffeh ;CPU復位
#endif
;------------------------------------------------
PUBLIC
OS_Free_Task
;空閑任務
;功能:進行CPU空閑計數
;本函數共有3行代碼
;------------------------------------------------
OS_Free_Task_jmp01
inc.w Free_Count ;空閑計數累加
bis.w #OS_FREE_FLAG,Task_Flag ;置上空閑任務標志
jmp OS_Free_Task_jmp01
;------------------------------------------------
PUBLIC
OS_Task_Lock
;禁止任務調度
;本函數共2行代碼
;------------------------------------------------
bis.w #OS_TASK_LOCK,Task_Flag
ret
;------------------------------------------------
PUBLIC
OS_Task_Unlock
;允許任務調度
;本函數共2行代碼
;------------------------------------------------
bic.w #OS_TASK_LOCK,Task_Flag
ret
;------------------------------------------------
PUBLIC
OS_Task_Wakeup
;功能:喚醒指定優先級的任務
;本函數共有7行代碼
;push.w #PRI
;call #OS_Task_Wakeup
;incd.w sp
;------------------------------------------------
push.w SR ;模擬中斷發生
dint
OS_Task_Wakeup_I
push.w r10
mov.w 6(sp),r10
add.w r10,r10
clr.w Task_Tick(r10)
br #OS_Sched_endfor01
Stack_Size_Table: ;每個任務棧的大小
DW (SOFTCLOCK_STACK_SIZE*2)
DW (TASK1_STACK_SIZE*2)
DW (TASK2_STACK_SIZE*2)
DW (TASK3_STACK_SIZE*2)
DW (TASK4_STACK_SIZE*2)
DW (LED_STACK_SIZE*2)
DW (FREE_STACK_SIZE*2)
OS_Task_Table:
DW softclock ;軟時鐘任務
DW task1 ;任務1
DW task2 ;任務2
DW task3 ;任務3
DW task4 ;任務4
DW taskled ;指示燈任務
DW OS_Free_Task ;空閑任務
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -