阅读:2382回复:1
单片机简单RTOS
我以前使用的,可以应付一般简单的任务,对于初学者可能有所帮助。
《本应该发在单片机抗干扰中,按成发新帖子》 补充一点: 对于一个好系统来说,既要有好的检错手段,还要有好的纠错能力。 纠错往往比检错更重要。 另外,我一般将未用的单元填充 LJMP 0000,在初始化中判断是否是热启动。 [编辑 - 6/18/03 by damson] |
|
沙发#
发布于:2003-06-18 23:01
发错了地方
还是贴上我以前用过的一种程序结构,相当于一种很原始的RTOS,权作改正,呵呵 ;-------------------------------------------------------- $NOMOD51 $INCLUDE(C:\\OMF51\\ASM\\REG52.INC) $INCLUDE(MACRO.H) $INCLUDE(DEFINE.H) $INCLUDE(JUMP_TAB.ASM) $SET(INIT_ALL=0) ;INIT_ALL=0,正常; INIT_ALL=1,初始化时钟; ;INIT_ALL=2,初始化EEPROM; INIT_ALL=3,初始化所有; MAIN: MOV IE,#00H ;Close all INT MOV SP,#0C0H ;Stack from C0h MOV TCON,#05H ;T1 and T0 (setb ITx) MOV TMOD,#12H ;T0为方式2,T1为方式1 MOV SCON,#50H ;方式1,允许接受 MOV PCON,#80H ;波特律加倍 MOV IP,#08 ;中断优先级,CT1增强 MOV TH0,#9CH ;大约为100us MOV TL0,#9CH MOV TH1,#0H MOV TL1,#0H CLR EA ;*************系统及用户初始化***************** $INCLUDE(ini.ASM) ;****************任务管理器******************** ;任务扫描顺序: ;显示->显示缓冲区更新->时间判断->看门狗->键盘-> ;滚屏任务->串口->系统检查 TASK_MAN: JNB TASK_ID,REST CLR TASK_ID AJMP DO_TASK REST: MOV SYSCONT,#00H ORL PCON,#01H AJMP TASK_MAN DO_TASK: JNB TIME_ID,$+11 CLR TIME_ID MOV SYSCONT,#01H LCALL Time_GX JNB BUF_ID,$+11 CLR BUF_ID; MOV SYSCONT,#02H LCALL BUF_GX JNB KEY_ID,$+11 CLR KEY_ID MOV SYSCONT,#04H LCALL KEYBOARD JNB IR_ID,$+11 CLR IR_ID MOV SYSCONT,#06H LCALL IR8PROC JNB DOG_ID,$+11 CLR DOG_ID MOV SYSCONT,#03H LCALL DOG ;kill ill task. MOV SYSCONT,#00H ORL PCON,#1H AJMP TASK_MAN ;***************用户任务执行区******************* $INCLUDE(KEYBOARD.ASM) ;键盘处理 $INCLUDE(IRPROC.ASM) ;遥控和保护处理 $INCLUDE(DISPLAY.ASM) ;显示程序 $INCLUDE(DOG.ASM) ;看门狗处理 $INCLUDE(TIME.ASM) ;时间更新 1S $INCLUDE(DISBUF.ASM) ;缓冲区更新、秒点处理、定时 ;*******************硬件层*********************** ;主要与硬件有关的部分 $INCLUDE(HARD.ASM) ;数码管显示、键盘预处理、探头信号预处理 ;******************中断服务区******************** $INCLUDE(ctX.ASM) $INCLUDE(serial.ASM) $INCLUDE(intX.ASM) ;******************子程序区********************** ;本区主要包含一些独立性较强可以直接移植使用的程序 $INCLUDE(I2C.ASM) $INCLUDE(SUB.ASM) ;*******************END************************* Length equ (8192-$)/3 REPT Length LJMP 0 ENDM END |
|