-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathm_rtos_kernel.asm
More file actions
191 lines (156 loc) · 3.62 KB
/
Copy pathm_rtos_kernel.asm
File metadata and controls
191 lines (156 loc) · 3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
;==========================================================================
;Kernel Macro
;==========================================================================
.MACRO SetTimerTask
ldi GREG, @0
ldi XL, Low(@1) ;
ldi XH, High(@1) ; ЗАдержка в милисекундах
rcall SetTimer
.ENDM
;==========================================================================
.MACRO SetTask
ldi GREG, @0 ; Обращение к процедуре через событийный диспетчер
rcall SendTask ;
.ENDM
;==========================================================================
.MACRO TimerService
push GREG
in GREG,SREG ; Save Sreg
push GREG ; Сохранение регистра GREG и регистра состояния SREG
push ZL
push ZH ; сохранение Регистра Z
push Counter ; сохранение Регистра Counter
ldi ZL,low(TimersPool) ; Загрузка с регистр Z адреса RAM,
ldi ZH,high(TimersPool); по которому находится информация о таймерах
ldi Counter,TimersPoolSize ; максимальное количество таймеров
Comp1L01: ld GREG,Z ; GREG = [Z] ; Получить номер события
cpi GREG,$FF ; Проверить на "NOP"
breq Comp1L03 ; Если NOP то переход к следующей позиции
clt ; Флаг T используется для сохранения информации об окончании счёта
ldd GREG,Z+1 ;
subi GREG,Low(1) ; Уменьшение младшей части счётчика на 1
std Z+1,GREG ;
breq Comp1L02 ; Если 0 то флаг T не устанавливаем
set ;
Comp1L02: ldd GREG,Z+2 ;
sbci GREG,High(1) ; Уменьшение старшей части счётчика на 1
std Z+2,GREG ;
brne Comp1L03 ; Счёт не окончен
brts Comp1L03 ; Счёт не окончен (по T)
ld GREG,Z ; Получить номер события
rcall SendTask ; послать в системную очередь задач
ldi GREG,$FF ; = NOP (задача выполнена, таймер самоудаляется)
st Z, GREG ; Clear Event
Comp1L03: subi ZL,Low(-3) ; Skip Counter
sbci ZH,High(-3) ; Z+=3 - переход к следующему таймеру
dec Counter ; счетчик таймеров
brne Comp1L01 ; Loop
pop Counter ; восстанавливаем переменные
pop ZH
pop ZL
pop GREG ; Восстанавливаем регистры
out SREG,GREG ;
pop GREG
.ENDM
;======================================================================================
.MACRO INIT_RTOS
outi SREG, 0x00 ; Инициализация SREG
rcall ClearTimers ; Очистить список таймеров РТОС
rcall ClearTaskQueue ; Очистить очередь событий РТОС
.ENDM
;=======================================================================================
;SRAM STS analog for Tiny
.MACRO LDR
PUSH ZL
PUSH ZH
LDI ZL,low(@1)
LDI ZH,High(@1)
LD @0,Z
POP ZH
POP ZL
.ENDM
.MACRO STR
PUSH ZL
PUSH ZH
LDI ZL,low(@0)
LDI ZH,High(@0)
ST Z,@1
POP ZH
POP ZL
.ENDM
.MACRO STSI
LDI GREG,@1
STS @0,GREG
.ENDM
;=======================================================================================
;FLASH
.MACRO LDF
PUSH ZL
PUSH ZH
LDI ZL,low(@1*2)
LDI ZH,High(@1*2)
LPM @0,Z
POP ZH
POP ZL
.ENDM
.MACRO LDPA
LDI ZL,low(@0*2)
LDI ZH,High(@0*2)
.ENDM
;========================================================================================
;XYZ
.MACRO LDX
LDI XL,low(@0)
LDI XH,High(@0)
.ENDM
.MACRO LDY
LDI YL,low(@0)
LDI YH,High(@0)
.ENDM
.MACRO LDZ
LDI ZL,low(@0)
LDI ZH,High(@0)
.ENDM
;========================================================================================
.MACRO CLEAR_RAM
RAM_Flush: LDI ZL,Low(SRAM_START)
LDI ZH,High(SRAM_START)
CLR R16
Flush: ST Z+,R16
CPI ZH,High(RAMEND)
BRNE Flush
CPI ZL,Low(RAMEND)
BRNE Flush
CLR R0
CLR R1
CLR R2
CLR R3
CLR R4
CLR R5
CLR R6
CLR R7
CLR R8
CLR R9
CLR R10
CLR R11
CLR R12
CLR R13
CLR R14
CLR R15
CLR R16
CLR R17
CLR R18
CLR R19
CLR R20
CLR R21
CLR R22
CLR R23
CLR R24
CLR R25
CLR R26
CLR R27
CLR R28
CLR R29
CLR R30
CLR R31
.ENDM