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

📄 taskhandler.s

📁 This a simple hardware UART test program. It receives text lines over the serial port and writes ba
💻 S
字号:
#include "hardware.h"#include "taskhandler.h"#include "tasklist.h"/**Simple TaskhandlerEach task is a function and has a corresponding bit in the variabletaskreg. TASK00 has bit 0x8000 which is the highest priority,TASK01~0x4000 etc. Up to 16 tasks are supported.Each task has to exit by itself (there is no task switching). Thiscauses a risk of priority inversion when a low priority task consumesmuch time.Each time a task exits, the taskbits are scanned from left to right,starting at the higest prio. If no taskbit is set, a lowpower mode isentered. Scanning for tasks is restarted when the CPU is woken upagain (external event, timer interrupt etc.).A task does not need to save any registers as on each run thetaskhandler is initilizing its registers.http://mspgcc.sf.netchris <cliechti@gmx.net>*/.extern TASK00.extern TASK01.extern TASK02.extern TASK03.extern TASK04.extern TASK05.extern TASK06.extern TASK07.extern TASK08.extern TASK09.extern TASK10.extern TASK11.extern TASK12.extern TASK13.extern TASK14.extern TASK15;variables.data        .global taskreg        .comm   taskreg,2,2                     ;short var, aligned. taskbits are stored here.text/**Taskhandler mainloop. This function never returns.*/.global taskhandler        .type taskhandler, @functiontaskhandler:        mov   r15, taskreg                      ; save parameter to taskreg.Ltsk1: mov   #0x8000, r15                      ; bitmask, used to scan task bits        mov   #tasktable, r14                   ; pointer to task function.Ltsk2: bit   r15, taskreg                      ; test mask on task bits        jc    .calltask                         ; if bit is set -> call task function        rrc   r15                               ; shift mask. carry is zero        incd  r14                               ; increment pointer on task function        cmp   #endtasktable, r14                ; check if bits for entire table have been tested        jlo   .Ltsk2                            ; #endtasktable < R5 --> it was not last entry, loop.golowpower:                                    ; if it was last entry...        bic.b #LEDRT, &P2OUT                    ; Activity indicator        bis   #LPM0, r2                         ; go in lowpower mode until wakeup trough interrupt        bis.b #LEDRT, &P2OUT                    ; Activity indicator        jmp   .Ltsk1                            ; restart searching on wakeup.calltask:        bic   r15, taskreg                      ; clear taskbit we're handling here        call  @r14                              ; call task itself, no need to save registers        jmp   .Ltsk1                            ; loop/**Table with task functions. User tasks are set up using macro definitions ("#define")in "tasklist.h".Task functions are "void f(void)". Any registers can be used and have not to be saved.(actualy the functions can be void f(unsigned short taskbit) with taskbit beeingthe bit that is associated with that task. this can be used if a task wants torestart itself: "taskreg |= taskbit;")*/tasktable:.word TASK00    // highest prio.word TASK01.word TASK02.word TASK03.word TASK04.word TASK05.word TASK06.word TASK07.word TASK08.word TASK09.word TASK10.word TASK11.word TASK12.word TASK13.word TASK14.word TASK15    // lowest prioendtasktable:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -