📄 demo.s43
字号:
;========================================================================================
; M430/OS 演示程序
; V1.10
; 说明:
; 此演示程序包含六个任务:
;
; softclock 软时钟任务
; task1 向端口2的每个管脚输出方波的任务
; task2 向端口3的每个管脚输出方波的任务
; task3 向端口4的每个管脚输出方波的任务
; task4 向端口5的每个管脚输出方波的任务
; taskled 点亮P1.0上指示灯的任务
;
; 6个任务,加上M430/OS的空闲任务,共7个任务,系统开辟了6块堆栈,空闲任务使用main程序的堆栈,空
;闲任务不保存现场。每块堆栈的大小可以不同。
;
; 软时钟任务利用M430/OS的多任务延时模拟了一个有年、月、日、时、分、秒的时钟,并且可以日期
; 时间格式为BCD格式或10进制格式。
; 此程序可以直接在MSP430F149的仿真头上运行
; 程序空间、数据空间都由编译器自动分配。
; 刘兵 public_rtos@163.com 2003年6月30日
;
;========================================================================================
NAME DEMO(16)
RSEG UDATA0(1)
RSEG IDATA0(1)
RSEG CDATA0(1)
RSEG CODE(1)
RSEG CONST(1)
COMMON INTVEC(1)
#include <msp430x14x.h>
#include "include.h"
PUBLIC Task_Tick
PUBLIC Task_SP
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 0ah ;LED指示灯的堆栈大小(单位:字)
EXTERN OS_Time_Dly
EXTERN OS_Init
EXTERN OS_Task_Create
EXTERN OS_Start
RSEG CODE
;------------------------------------------------------------------------------
;引导程序。CPU复位后执行此程序,由程序调用MSP430/OS的多任务初始化数来启动多任务
main
;------------------------------------------------------------------------------
mov.w #0a00h,sp ;此处初始化的堆栈就是空闲任务的堆栈,这一点和M430/OS V1.00版本不同
#ifndef debug
mov.w #WDT_MDLY_32,&WDTCTL ;在release版本下设置看门狗为32ms,release版本的程序不能单步运行
#else
mov.w #(WDTPW+WDTHOLD),&WDTCTL ;在debug版本下把看门狗禁止掉,debug版本可以单步执行
#endif
call #OS_Init ;初始化多任务数据
push.w #softclock_info
call #OS_Task_Create ;建立软时钟任务
mov.w #task1_info,0(sp)
call #OS_Task_Create ;建立任务1
mov.w #task2_info,0(sp)
call #OS_Task_Create ;建立任务2
mov.w #task3_info,0(sp)
call #OS_Task_Create ;建立任务3
mov.w #task4_info,0(sp)
call #OS_Task_Create ;建立任务4
mov.w #taskled_info,0(sp)
call #OS_Task_Create ;建立指示灯任务
incd.w sp
push.w #4000 ;设置任务调度周期为5ms,即每秒调度200次
call #OS_Start ;任务初始化完后多任务开始启动
;------------------------------------------------------------------------------
;软时钟任务
softclock
;------------------------------------------------------------------------------
clr.b &second
#ifndef BCD_FORMAT
mov.b #30,&minute
mov.b #11,&hour
mov.b #25,&day
mov.b #6,&month
mov.w #2003,&year
softclock_loop
push.w #200
call #OS_Time_Dly
incd.w sp
cmp.b #59,second
jge second_c
inc.b second
jmp softclock_loop
second_c
clr.b second
cmp.b #59,&minute
jge minute_c
inc.b &minute
jmp softclock_loop
minute_c
clr.b &minute
cmp.b #23,&hour
jge hour_c
inc.b &hour
jmp softclock_loop
hour_c
clr.b &hour
clr.w r10
mov.b &month,r10 ;月份放入r10,判断每月多少天
mov.w &year,r11 ;年份放入r11,判断平年闰年
and.w #03h,r11
tst.w r11
jz year_pn
cmp.b &day,month_table_c(r10) ;闰年
jl day_c
inc.b &day
jmp softclock_loop
year_pn
cmp.b &day,month_table(r10) ;平年
jl day_c
inc.b &day
jmp softclock_loop
day_c
mov.b #01h,&day
mov.b #12,r10
cmp.b &month,r10
jl month_c
inc.b &month
jmp softclock_loop
month_c
mov.b #01h,&month
inc.w &year
jmp softclock_loop
#else
mov.b #30h,&minute
mov.b #11h,&hour
mov.b #25h,&day
mov.b #6h,&month
mov.w #2003h,&year
softclock_loop
push.w #200
call #OS_Time_Dly
incd.w sp
cmp.b #59h,second
jge second_c
dadd.b #01h,second
jmp softclock_loop
second_c
clr.b second
cmp.b #59h,&minute
jge minute_c
dadd.b #01h,&minute
jmp softclock_loop
minute_c
clr.b &minute
cmp.b #23h,&hour
jge hour_c
dadd.b #01h,&hour
jmp softclock_loop
hour_c
clr.b &hour
clr.w r10
mov.b &month,r10 ;月份放入r10,判断每月多少天
mov.w &year,r11 ;年份放入r11,判断平年闰年
and.w #03h,r11
tst.w r11
jz year_pn
cmp.b &day,month_table_c_BCD(r10) ;闰年
jl day_c
dadd.b #01h,&day
jmp softclock_loop
year_pn
cmp.b &day,month_table_BCD(r10) ;平年
jl day_c
dadd.b #01h,&day
jmp softclock_loop
day_c
mov.b #01h,&day
mov.b #12h,r10
cmp.b &month,r10
jl month_c
dadd.b #01h,&month
jmp softclock_loop
month_c
mov.b #01h,&month
dadd.w #01h,&year
jmp softclock_loop
#endif
;------------------------------------------------------------------------------
task1
;------------------------------------------------------------------------------
mov.b #055h,&P2OUT
mov.b #0ffh,&P2DIR
task1_loop
push.w #57
call #OS_Time_Dly
incd.w sp
xor.b #0ffh,&P2OUT
jmp task1_loop
;------------------------------------------------------------------------------
task2
;------------------------------------------------------------------------------
mov.b #0aah,&P3OUT
mov.b #0ffh,&P3DIR
task2_loop
push.w #23
call #OS_Time_Dly
incd.w sp
xor.b #0ffh,&P2OUT
jmp task2_loop
;------------------------------------------------------------------------------
task3
;------------------------------------------------------------------------------
mov.b #05ah,&P4OUT
mov.b #0ffh,&P4DIR
task3_loop
push.w #73
call #OS_Time_Dly
incd.w sp
xor.b #0ffh,&P2OUT
jmp task3_loop
;------------------------------------------------------------------------------
task4
;------------------------------------------------------------------------------
mov.b #0a5h,&P5OUT
mov.b #0ffh,&P5DIR
task4_loop
push.w #41
call #OS_Time_Dly
incd.w sp
xor.b #0ffh,&P2OUT
jmp task4_loop
;------------------------------------------------------------------------------
;指灯任务
;功能:用MSP30F149仿真头上P1口的LED演示”运行“灯的闪烁
taskled
;------------------------------------------------------------------------------
bic.b #BIT0,&P1OUT
bis.b #BIT0,&P1DIR
taskled_loop
push.w #100
call #OS_Time_Dly
incd.w sp
xor.b #BIT0,&P1OUT
jmp taskled_loop
RSEG CONST
month_table: db 31 ,28 ,31 ,30 ,31 ,30 ,31 ,31 ,30 ,31 ,30 ,31
month_table_c: db 31 ,29 ,31 ,30 ,31 ,30 ,31 ,31 ,30 ,31 ,30 ,31
month_table_BCD: db 31h,28h,31h,30h,31h,30h,31h,31h,30h,31h,30h,31h
month_table_c_BCD: db 31h,29h,31h,30h,31h,30h,31h,31h,30h,31h,30h,31h
softclock_info:
dw softclock ;任务首址
dw softclock_stack ;堆栈首址
dw softclock_stack_point ;堆栈指针
dw softclock_time_tick ;时钟滴答
dw SOFTCLOCK_STACK_SIZE*2 ;堆栈大小
task1_info:
dw task1
dw task1_stack
dw task1_stack_point
dw task1_time_tick
dw TASK1_STACK_SIZE*2
task2_info:
dw task2
dw task2_stack
dw task2_stack_point
dw task2_time_tick
dw TASK2_STACK_SIZE*2
task3_info:
dw task3
dw task3_stack
dw task3_stack_point
dw task3_time_tick
dw TASK3_STACK_SIZE*2
task4_info:
dw task4
dw task4_stack
dw task4_stack_point
dw task4_time_tick
dw TASK4_STACK_SIZE*2
taskled_info:
dw taskled
dw taskled_stack
dw taskled_stack_point
dw taskled_time_tick
dw LED_STACK_SIZE*2
RSEG UDATA0
softclock_stack:
ds SOFTCLOCK_STACK_SIZE*2
task1_stack:
ds TASK1_STACK_SIZE*2
task2_stack:
ds TASK2_STACK_SIZE*2
task3_stack:
ds TASK3_STACK_SIZE*2
task4_stack:
ds TASK4_STACK_SIZE*2
taskled_stack:
ds LED_STACK_SIZE*2
RSEG IDATA0
Task_SP:
softclock_stack_point:
ds 2
task1_stack_point:
ds 2
task2_stack_point:
ds 2
task3_stack_point:
ds 2
task4_stack_point:
ds 2
taskled_stack_point:
ds 2
Task_Tick:
softclock_time_tick:
ds 2
task1_time_tick:
ds 2
task2_time_tick:
ds 2
task3_time_tick:
ds 2
task4_time_tick:
ds 2
taskled_time_tick:
ds 2
RSEG CDATA0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
dw 0
COMMON INTVEC
ds RESET_VECTOR
dw main
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -