📄 main.lss
字号:
2ca: ff 1f adc r31, r31
2cc: eb 5f subi r30, 0xFB ; 251
2ce: fe 4f sbci r31, 0xFE ; 254
2d0: 82 81 ldd r24, Z+2 ; 0x02
2d2: 93 81 ldd r25, Z+3 ; 0x03
2d4: 00 97 sbiw r24, 0x00 ; 0
2d6: 11 f0 breq .+4 ; 0x2dc <OSTaskSemPend+0x78>
return 0;
}
return 1;
2d8: 81 e0 ldi r24, 0x01 ; 1
2da: 90 e0 ldi r25, 0x00 ; 0
2dc: df 91 pop r29
2de: cf 91 pop r28
2e0: 08 95 ret
000002e2 <OSSemPost>:
}
/***********************************************************************
** 函数名: OSSemPost()
** 子函数: 无
** 输 入: Index任务ID
** 输 出: 无
** 功 能: 发送一个信号量,可以从任务或中断发送
------------------------------------------------------------------------
************************************************************************/
void OSSemPost(unsigned char Index)
{
2e2: cf 93 push r28
2e4: df 93 push r29
2e6: e8 2f mov r30, r24
if(Sem[Index].OSEventType) //当要求的信号量是共享型
2e8: 99 27 eor r25, r25
2ea: dc 01 movw r26, r24
2ec: aa 0f add r26, r26
2ee: bb 1f adc r27, r27
2f0: a8 0f add r26, r24
2f2: b9 1f adc r27, r25
2f4: a3 55 subi r26, 0x53 ; 83
2f6: bd 4f sbci r27, 0xFD ; 253
2f8: 8c 91 ld r24, X
2fa: ed 01 movw r28, r26
2fc: 9a 81 ldd r25, Y+2 ; 0x02
2fe: 88 23 and r24, r24
300: 29 f0 breq .+10 ; 0x30c <OSSemPost+0x2a>
{
Sem[Index].OSEventState=0x01; //使信号量有效
302: 81 e0 ldi r24, 0x01 ; 1
304: 89 83 std Y+1, r24 ; 0x01
OSRdyTbl |=Sem [Index].OSTaskPendTbl; //使在等待该信号的所有任务就绪
306: 29 2a or r2, r25
Sem[Index].OSTaskPendTbl=0; //清空所有等待该信号的等待任务
308: 1a 82 std Y+2, r1 ; 0x02
30a: 33 c0 rjmp .+102 ; 0x372 <OSSemPost+0x90>
}
else //当要求的信号量为独占型
{
unsigned char i;
for (i = 0; i < OS_TASKS && !(Sem[Index].OSTaskPendTbl & (0x01<<i)); i++);
30c: 48 2f mov r20, r24
30e: 90 fd sbrc r25, 0
310: 0e c0 rjmp .+28 ; 0x32e <OSSemPost+0x4c>
312: 4f 5f subi r20, 0xFF ; 255
314: 44 30 cpi r20, 0x04 ; 4
316: 58 f4 brcc .+22 ; 0x32e <OSSemPost+0x4c>
318: ed 01 movw r28, r26
31a: 8a 81 ldd r24, Y+2 ; 0x02
31c: 99 27 eor r25, r25
31e: 04 2e mov r0, r20
320: 02 c0 rjmp .+4 ; 0x326 <OSSemPost+0x44>
322: 95 95 asr r25
324: 87 95 ror r24
326: 0a 94 dec r0
328: e2 f7 brpl .-8 ; 0x322 <OSSemPost+0x40>
32a: 80 ff sbrs r24, 0
32c: f2 cf rjmp .-28 ; 0x312 <OSSemPost+0x30>
32e: 8e 2f mov r24, r30
330: 99 27 eor r25, r25
if(i < OS_TASKS) //如果有任务需要
332: 44 30 cpi r20, 0x04 ; 4
334: a8 f4 brcc .+42 ; 0x360 <OSSemPost+0x7e>
{
Sem[Index].OSTaskPendTbl &= ~(0x01<<i);//从等待表中去除
336: fc 01 movw r30, r24
338: ee 0f add r30, r30
33a: ff 1f adc r31, r31
33c: e8 0f add r30, r24
33e: f9 1f adc r31, r25
340: e3 55 subi r30, 0x53 ; 83
342: fd 4f sbci r31, 0xFD ; 253
344: 21 e0 ldi r18, 0x01 ; 1
346: 30 e0 ldi r19, 0x00 ; 0
348: 02 c0 rjmp .+4 ; 0x34e <OSSemPost+0x6c>
34a: 22 0f add r18, r18
34c: 33 1f adc r19, r19
34e: 4a 95 dec r20
350: e2 f7 brpl .-8 ; 0x34a <OSSemPost+0x68>
352: 92 2f mov r25, r18
354: 90 95 com r25
356: 82 81 ldd r24, Z+2 ; 0x02
358: 89 23 and r24, r25
35a: 82 83 std Z+2, r24 ; 0x02
OSRdyTbl |= 0x01<<i; //任务就绪
35c: 22 2a or r2, r18
35e: 09 c0 rjmp .+18 ; 0x372 <OSSemPost+0x90>
}
else
{
Sem[Index].OSEventState =1; //使信号量有效
360: fc 01 movw r30, r24
362: ee 0f add r30, r30
364: ff 1f adc r31, r31
366: e8 0f add r30, r24
368: f9 1f adc r31, r25
36a: e3 55 subi r30, 0x53 ; 83
36c: fd 4f sbci r31, 0xFD ; 253
36e: 81 e0 ldi r24, 0x01 ; 1
370: 81 83 std Z+1, r24 ; 0x01
372: df 91 pop r29
374: cf 91 pop r28
376: 08 95 ret
00000378 <OSTaskSemPost>:
}
}
}
/***********************************************************************
** 函数名: OSTaskSemPost()
** 子函数: 无
** 输 入: Index任务ID
** 输 出: 无
** 功 能: 从任务发送一个信号量,并进行调度
------------------------------------------------------------------------
************************************************************************/
void OSTaskSemPost(unsigned char Index)
{
OSSemPost(Index);
378: 0e 94 71 01 call 0x2e2 <OSSemPost>
OSSched();
37c: 0e 94 76 00 call 0xec <OSSched>
380: 08 95 ret
00000382 <OSSemClean>:
}
//
//
/***********************************************************************
** 函数名: OSSemClean()
** 子函数: 无
** 输 入: Index任务ID
** 输 出: 无
** 功 能: 清除一个信号量,只对共享型的有用。
** 对于独占型的信号量,在任务占用后,就交得不可以用了。
------------------------------------------------------------------------
************************************************************************/
void OSSemClean(unsigned char Index)
{
Sem[Index].OSEventState =0; //要求的信号量无效
382: 99 27 eor r25, r25
384: fc 01 movw r30, r24
386: ee 0f add r30, r30
388: ff 1f adc r31, r31
38a: e8 0f add r30, r24
38c: f9 1f adc r31, r25
38e: e3 55 subi r30, 0x53 ; 83
390: fd 4f sbci r31, 0xFD ; 253
392: 11 82 std Z+1, r1 ; 0x01
394: 08 95 ret
00000396 <TCN0Init>:
}
/***********************************************
** 函数名: TCN0Init
** 功 能: 初始化定时器0作为时钟节拍 5ms
** 输 入: 无
** 输 出: 无
------------------------------------------------
***********************************************/
void TCN0Init(void) // 计时器0
{
TCCR0 = 0;
396: 13 be out 0x33, r1 ; 51
TCCR0 |= (1<<CS02); // 256预分频
398: 83 b7 in r24, 0x33 ; 51
39a: 84 60 ori r24, 0x04 ; 4
39c: 83 bf out 0x33, r24 ; 51
TIMSK |= (1<<TOIE0); // T0溢出中断允许
39e: 89 b7 in r24, 0x39 ; 57
3a0: 81 60 ori r24, 0x01 ; 1
3a2: 89 bf out 0x39, r24 ; 57
TCNT0 = 100; // 置计数起始值
3a4: 84 e6 ldi r24, 0x64 ; 100
3a6: 82 bf out 0x32, r24 ; 50
3a8: 08 95 ret
000003aa <__vector_11>:
}
/***********************************************
** 函数名: SIGNAL
** 功 能: 时钟节拍中断 5ms
** 输 入: 无
** 输 出: 无
------------------------------------------------
***********************************************/
SIGNAL(SIG_OVERFLOW0)
{
3aa: 1f 92 push r1
3ac: 0f 92 push r0
3ae: 0f b6 in r0, 0x3f ; 63
3b0: 0f 92 push r0
3b2: 11 24 eor r1, r1
3b4: 2f 93 push r18
3b6: 3f 93 push r19
3b8: 4f 93 push r20
3ba: 5f 93 push r21
3bc: 6f 93 push r22
3be: 7f 93 push r23
3c0: 8f 93 push r24
3c2: 9f 93 push r25
3c4: af 93 push r26
3c6: bf 93 push r27
3c8: ef 93 push r30
3ca: ff 93 push r31
IntNum++; //中断嵌套+1
3cc: 43 94 inc r4
sei(); //在中断中,重开中断
3ce: 78 94 sei
3d0: 61 e0 ldi r22, 0x01 ; 1
3d2: 70 e0 ldi r23, 0x00 ; 0
3d4: e5 e0 ldi r30, 0x05 ; 5
3d6: f1 e0 ldi r31, 0x01 ; 1
3d8: 20 e0 ldi r18, 0x00 ; 0
3da: 30 e0 ldi r19, 0x00 ; 0
3dc: 43 e0 ldi r20, 0x03 ; 3
unsigned char i;
for(i=0;i<OS_TASKS;i++) //任务时钟
{
if(TCB[i].OSWaitTick && TCB[i].OSWaitTick!=0xffff)
3de: 82 81 ldd r24, Z+2 ; 0x02
3e0: 93 81 ldd r25, Z+3 ; 0x03
3e2: 00 97 sbiw r24, 0x00 ; 0
3e4: 91 f0 breq .+36 ; 0x40a <__vector_11+0x60>
3e6: 5f ef ldi r21, 0xFF ; 255
3e8: 8f 3f cpi r24, 0xFF ; 255
3ea: 95 07 cpc r25, r21
3ec: 71 f0 breq .+28 ; 0x40a <__vector_11+0x60>
{
TCB[i].OSWaitTick--;
3ee: 01 97 sbiw r24, 0x01 ; 1
3f0: 93 83 std Z+3, r25 ; 0x03
3f2: 82 83 std Z+2, r24 ; 0x02
if(TCB[i].OSWaitTick==0) //当任务时钟到时,必须是由定时器减时的才行
3f4: 89 2b or r24, r25
3f6: 49 f4 brne .+18 ; 0x40a <__vector_11+0x60>
{
OSRdyTbl |= (0x01<<i); //使任务可以重新运行
3f8: cb 01 movw r24, r22
3fa: 02 2e mov r0, r18
3fc: 02 c0 rjmp .+4 ; 0x402 <__vector_11+0x58>
3fe: 88 0f add r24, r24
400: 99 1f adc r25, r25
402: 0a 94 dec r0
404: e2 f7 brpl .-8 ; 0x3fe <__vector_11+0x54>
406: 28 2a or r2, r24
OSCoreState|=0x02; //要求任务切换的标志位
408: 02 60 ori r16, 0x02 ; 2
40a: 41 50 subi r20, 0x01 ; 1
40c: 2f 5f subi r18, 0xFF ; 255
40e: 3f 4f sbci r19, 0xFF ; 255
410: 34 96 adiw r30, 0x04 ; 4
412: 47 ff sbrs r20, 7
414: e4 cf rjmp .-56 ; 0x3de <__vector_11+0x34>
}
}
}
TCNT0=100;
416: 84 e6 ldi r24, 0x64 ; 100
418: 82 bf out 0x32, r24 ; 50
cli();
41a: f8 94 cli
IntNum--; //中断嵌套-1
41c: 4a 94 dec r4
IntSwitch(); //进行任务调度
41e: 0e 94 d0 00 call 0x1a0 <IntSwitch>
422: ff 91 pop r31
424: ef 91 pop r30
426: bf 91 pop r27
428: af 91 pop r26
42a: 9f 91 pop r25
42c: 8f 91 pop r24
42e: 7f 91 pop r23
430: 6f 91 pop r22
432: 5f 91 pop r21
434: 4f 91 pop r20
436: 3f 91 pop r19
438: 2f 91 pop r18
43a: 0f 90 pop r0
43c: 0f be out 0x3f, r0 ; 63
43e: 0f 90 pop r0
440: 1f 90 pop r1
442: 18 95 reti
00000444 <RT12864delay_ms>:
------------------------------------------------
************************************************/
void RT12864delay_ms(unsigned int n)
{
unsigned int i=2280;
444: 28 ee ldi r18, 0xE8 ; 232
446: 38 e0 ldi r19, 0x08 ; 8
for(;n>0;n--)
448: 00 97 sbiw r24, 0x00 ; 0
44a: 51 f0 breq .+20 ; 0x460 <RT12864delay_ms+0x1c>
{
while(i--);
44c: 21 50 subi r18, 0x01 ; 1
44e: 30 40 sbci r19, 0x00 ; 0
450: 4f ef ldi r20, 0xFF ; 255
452: 2f 3f cpi r18, 0xFF ; 255
454: 34 07 cpc r19, r20
456: d1 f7 brne .-12 ; 0x44c <RT12864delay_ms+0x8>
i=2280;
458: 28 ee ldi r18, 0xE8 ; 232
45a: 38 e0 ldi r19, 0x08 ; 8
45c: 01 97 sbiw r24, 0x01 ; 1
45e: f4 cf rjmp .-24 ; 0x448 <RT12864delay_ms+0x4>
460: 08 95 ret
00000462 <sentbyte_12864>:
}
}
//*************函数部分***************/
/* 名字:sentbyte_12864() */
/* 功能:把一字节送到RT12864M */
/* 局部变量:sentbyte */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -