分享的是我寫的一個雙任務并行的程序。一個任務是“main”函數的死循環,另外一個任務是函數“task1”中的死循環。任務操作很簡單,就是兩個io口不停在切換電平,但是由于兩個任務中的時間延時不一樣而是切換電平的頻率不一樣。單片機用的是瑞薩k0s系列的單片機(應為這個是我工作中常用的型號,我現在對這個比較熟,而51單片機很久沒有用過了,所以用的是這個型號,什么時候有空了我再寫個51單片機的程序)。有這個系列單片機開發板的可以單步運行看看任務切換過程中“偷換”堆棧內容的過程。(后面將分享我在這個平臺下寫的一個簡單的時間片輪轉的小操作系統)修改堆棧內容的中斷函數:
__interrupt void MD_INTTM80( void )
{
/* TODO */
#asm
push ax
push bc
push de
push hl
movw ax,sp
movw bc,ax
mov a,#0ffh
sub a, c
inc a
mov c,a ;the sp_long
;/*********************;load the sp_long*****************************/
mov a,c
mov !0fec0h,a ;load the sp_long
;/**************************************************/
mov b,a ;load the data
movw de,#0feffh
movw hl,#0fec1h
?L_mov1: mov a,[de]
mov [hl],a
decw de
dec b
incw hl
mov a,b
cmp a,#0h
bnz $?L_mov1
;/************************load the data to sp**************************/
mov a,!0fea0h ;load the data to sp
mov b,a
movw de,#0fea1h
movw hl,#0feffh
?L_mov2: mov a,[de]
mov [hl],a
incw de
dec b
decw hl
mov a,b
cmp a,#0h
bnz $?L_mov2
;/*************************get the new sp_point*************************/
mov a,#0ffh ;get the new sp_point
sub a,!0fea0h
inc a
mov !0fe90h,a
mov a,#0feh
mov !0fe91h,a
;/************************save the sp_data**************************/
mov a,!0fec0h ;save the sp_data
mov !0fea0h,a
mov b,a
movw de,#0fec1h
movw hl,#0fea1h
?L_mov_sp: mov a,[de]
mov [hl],a
incw de
dec b
incw hl
mov a,b
cmp a,#0h
bnz $?L_mov_sp
#endasm
/**************************************************/
#asm
mov a,!0fe90h
mov x,a
mov a,!0fe91h
movw sp,ax
pop hl
pop de
pop bc
pop ax
#endasm
}
附上原理圖,之后咱們再談談如何設計復雜的多任務程序
程序和原理圖:
AVR-多任務模擬系統設計(程序 原理圖).rar