📄 test.lss
字号:
__asm__ __volatile__("LDI R16,0x00 \n\t");
18a: 00 e0 ldi r16, 0x00 ; 0
/*
清除中断要求任务切换的标志位,清除正在任务切换标志位,
表示任务切换已经完成。
*/
__asm__ __volatile__("RETI \n\t"); /*返回并开中断 */
18c: 18 95 reti
18e: 08 95 ret
00000190 <IntSwitch>:
}
/************************************************************************************************************************
函数名称: IntSwitch
函数原型: void IntSwitch(void)
函数功能: 从中断退出并进行调度
入口参数: 无
出口参数: 无
有关说明: 当无中断嵌套并且中断中要求进行任务切换时才进行任务切换。
* 因为从中断到运行下一个任务共调用了两次子函数,所以要弹出四个入栈的PC
创建时间: 2007年3月3日
修改时间:
************************************************************************************************************************/
void IntSwitch(void)
{
if((OSCoreState == 0x02) && (OSIntNesting == 0))
190: 02 30 cpi r16, 0x02 ; 2
192: 41 f4 brne .+16 ; 0x1a4
194: 44 20 and r4, r4
196: 31 f4 brne .+12 ; 0x1a4
{
/*
进入中断时,已经保存了SREG和R0,R1,R18~R27,R30,R31,
所以没有必要再保存一次了,直接跳转到Int_OSSched进行下一个调度
*/
__asm__ __volatile__("POP R31 \n\t"); /*去除因调用子程序而入栈的PC*/
198: ff 91 pop r31
__asm__ __volatile__("POP R31 \n\t");
19a: ff 91 pop r31
__asm__ __volatile__("POP R31 \n\t");
19c: ff 91 pop r31
__asm__ __volatile__("POP R31 \n\t");
19e: ff 91 pop r31
__asm__ __volatile__("LDI R16,0x01 \n\t");
1a0: 01 e0 ldi r16, 0x01 ; 1
/*
清除中断要求任务切换的标志位,设置正在任务切换标志位
*/
__asm__ __volatile__("RJMP Int_OSSched \n\t"); /*重新调度 */
1a2: ba cf rjmp .-140 ; 0x118
1a4: 08 95 ret
1a6: 08 95 ret
000001a8 <OSFindPrioHighRdy>:
}
}
/************************************************************************************************************************
函数名称: OSSched
函数原型: void OSSched(void)
函数功能: 任务调度器,进行任务调度
入口参数: 无
出口参数: 无
有关说明: 只有有更高优先级的任务就绪时才进行一次任务切换,否则不做切换
创建时间: 2007年3月7日
修改时间:
************************************************************************************************************************/
void OSSched (void)
{
OSFindPrioHighRdy(); /*找出就绪表中优先级最高的任务*/
if(OSPrioHighRdy != OSPrioCur) /*如果不是当前运行的任务,进行任务调度*/
{
OS_TASK_SW(); /*调度任务*/
}
}
/************************************************************************************************************************
函数名称: OSTaskSuspend
函数原型: void OSTaskSuspend(Uint_8bit prio)
函数功能: 挂起任务
入口参数: prio:任务优先级
出口参数: 无
有关说明: 一个任务可以挂起本身也可以挂起其他任务
创建时间: 2007年3月3日
修改时间:
************************************************************************************************************************/
void OSTaskSuspend(Uint_8bit prio)
{
OS_ENTER_CRITICAL();
TCB[prio].OSWaitTick=0;
OSRdyTbl &= ~(0x01<<prio); /*从任务就绪表上去除标志位 */
if(OSPrioCur == prio) /*当要挂起的任务为当前任务 */
{
OS_EXIT_CRITICAL();
OSSched(); /*重新调度 */
return;
}
OS_EXIT_CRITICAL();
}
/************************************************************************************************************************
函数名称: OSTaskResume
函数原型: void OSTaskResume(Uint_8bit prio)
函数功能: 恢复任务 可以让被OSTaskSuspend或 OSTimeDly暂停的任务恢复
入口参数: prio:任务优先级
出口参数: 无
有关说明:
创建时间: 2007年3月3日
修改时间:
************************************************************************************************************************/
void OSTaskResume(Uint_8bit prio)
{
OS_ENTER_CRITICAL();
OSRdyTbl |= 0x01<<prio; /*从任务就绪表上重置标志位 */
TCB[prio].OSWaitTick=0; /*将时间计时设为0,到时 */
if(OSPrioCur > prio) /*当要当前任务的优先级低于重置位的任务的优先级 */
{
OS_EXIT_CRITICAL();
OSSched(); /*重新调度 */
return;
}
OS_EXIT_CRITICAL();
}
/************************************************************************************************************************
函数名称: OSTimeDly
函数原型: void OSTimeDly(Uint_16bit ticks)
函数功能: 任务延时
入口参数: 延时的时间,任务时钟的个数
出口参数: 无
有关说明: 如果延时65535(0xffff)则为无限延时
创建时间: 2007年3月3日
修改时间:
************************************************************************************************************************/
void OSTimeDly(Uint_16bit ticks)
{
if(ticks) /*当延时有效 */
{
OS_ENTER_CRITICAL();
OSRdyTbl &= ~(0x01<<OSPrioCur); /*把任务从就绪表中去掉*/
TCB[OSPrioCur].OSWaitTick=ticks;
OS_EXIT_CRITICAL();
OSSched(); /*重新调度 */
}
}
/************************************************************************************************************************
函数名称: OSSemCreat
函数原型: void OSSemCreat(Uint_8bit Index,Uint_8bit Type)
函数功能: 初始化信号量
入口参数: Index:信号量的序号;Type:信号量类型
出口参数: 无
有关说明: Type为 0 信号量独占型;1 信号量共享型
创建时间: 2007年3月3日
修改时间:
************************************************************************************************************************/
void OSSemCreat(Uint_8bit Index,Uint_8bit Type)
{
Sem[Index].OSEventType=Type;
Sem[Index].OSTaskPendTbl=0; /*初始化时任务等待列表为空*/
Sem[Index].OSEventState=0; /*信号量无效*/
}
/************************************************************************************************************************
函数名称: OSTaskSemPend
函数原型: Uint_8bit OSTaskSemPend(Uint_8bit Index,Uint_16bit Timeout)
函数功能: 任务等待信号量,挂起
入口参数: Index:信号量序号;Timeout:等待时间
出口参数: 无
有关说明: 当Timeout==0xffff时,为无限等待
创建时间: 2007年3月3日
修改时间:
************************************************************************************************************************/
Uint_8bit OSTaskSemPend(Uint_8bit Index,Uint_16bit Timeout)
{
if(Sem[Index].OSEventState) /*信号量有效 */
{
if(Sem[Index].OSEventType == 0) /*如果为独占型 */
{
Sem[Index].OSEventState = 0x00; /*信号量被独占,不可用*/
}
}
else
{ /*加入信号的任务等待表*/
OS_ENTER_CRITICAL();
Sem[Index].OSTaskPendTbl |= 0x01<<OSPrioCur;
TCB[OSPrioCur].OSWaitTick = Timeout; /*定义等待超时 */
OSRdyTbl &= ~(0x01<<OSPrioCur); /*从任务就绪表中去除 */
OS_EXIT_CRITICAL();
OSSched(); /*重新调度 */
if(TCB[OSPrioCur].OSWaitTick==0 ) /*超时,未能拿到资源 */
{
return 0;
}
}
return 1;
}
/************************************************************************************************************************
函数名称: OSSemPost
函数原型: void OSSemPost(Uint_8bit Index)
函数功能: 发送一个信号量,可以从任务或中断发送,
* 发送完了信号量之后不进行任务调度,推荐在中断中调用
入口参数: Index:信号量的序号
出口参数: 无
有关说明: 如果有任务在等待该信号量则将该任务就绪,没有任务等待则仅仅是把信号量置为有效
创建时间: 2007年3月3日
修改时间:
************************************************************************************************************************/
void OSSemPost(Uint_8bit Index)
{
if(Sem[Index].OSEventType) /*当要求的信号量是共享型 */
{
OS_ENTER_CRITICAL();
Sem[Index].OSEventState=0x01; /*使信号量有效 */
OSRdyTbl |=Sem [Index].OSTaskPendTbl; /*使在等待该信号的所有任务就绪*/
Sem[Index].OSTaskPendTbl=0; /*清空所有等待该信号的等待任务*/
OS_EXIT_CRITICAL();
}
else /*当要求的信号量为独占型 */
{
Uint_8bit i;
i=0;
while ((i < OS_TASKS) && (!(Sem[Index].OSTaskPendTbl & (0x01<<i))))
{
i++;
/*
找出信号量等待列表中任务优先级最高的任务
*/
}
if(i < OS_TASKS) /*如果有任务需要 */
{
OS_ENTER_CRITICAL();
Sem[Index].OSTaskPendTbl &= ~(0x01<<i); /*从等待表中去除 */
OSRdyTbl |= 0x01<<i; /*任务就绪 */
OS_EXIT_CRITICAL();
}
else /*没有任务等待该信号量 */
{
Sem[Index].OSEventState = 1; /*使信号量有效 */
}
}
}
/************************************************************************************************************************
函数名称: OSTaskSemPost
函数原型: void OSTaskSemPost(Uint_8bit Index)
函数功能: 从任务发送一个信号量,并进行调度
入口参数: Index:信号量的序号
出口参数: 无
有关说明: 在任务中调用
创建时间: 2007年3月3日
修改时间:
************************************************************************************************************************/
void OSTaskSemPost(Uint_8bit Index)
{
OSSemPost(Index);
OSSched();
}
/************************************************************************************************************************
函数名称: OSSemClean
函数原型: void OSSemClean(Uint_8bit Index)
函数功能: 清除一个信号量,只对共享型的有用。 对于独占型的信号量,在任务占用后,就变得不可以用了
入口参数: Index:信号量的序号
出口参数: 无
有关说明:
创建时间: 2007年3月3日
修改时间:
************************************************************************************************************************/
void OSSemClean(Uint_8bit Index)
{
Sem[Index].OSEventState = 0; /*要求的信号量无效*/
}
/************************************************************************************************************************
函数名称: TCN0Init
函数原型: void TCN0Init(void)
函数功能: 初始化定时器0
入口参数: 无
出口参数: 无
有关说明: 定时器T0是任务时钟
创建时间: 2007年3月3日
修改时间:
************************************************************************************************************************/
void TCN0Init(void)
{
TCCR0 = 0;
TCCR0 |= (1<<CS02); /* 256预分频 */
TIMSK |= (1<<TOIE0); /* T0溢出中断允许 */
TCNT0 = 100; /* 置计数起始值 */
}
/************************************************************************************************************************
函数名称: OSFindPrioHighRdy
函数原型: void OSFindPrioHighRdy (void)
函数功能: 找出任务就绪表中的最高优先级的任务
入口参数: 无
出口参数: 无
有关说明:
创建时间: 2007年3月7日
修改时间:
************************************************************************************************************************/
void OSFindPrioHighRdy (void)
{
Uint_8bit OSNextTaskPrio;
OSNextTaskPrio = 0;
1a8: 40 e0 ldi r20, 0x00 ; 0
while ((OSNextTaskPrio < OS_TASKS) && (!(OSRdyTbl & (0x01<<OSNextTaskPrio))))
{
OSNextTaskPrio++;
1aa: 22 2d mov r18, r2
1ac: 33 27 eor r19, r19
1ae: 20 fd sbrc r18, 0
1b0: 0c c0 rjmp .+24 ; 0x1ca
1b2: 4f 5f subi r20, 0xFF ; 255
1b4: 43 30 cpi r20, 0x03 ; 3
1b6: 48 f4 brcc .+18 ; 0x1ca
1b8: c9 01 movw r24, r18
1ba: 04 2e mov r0, r20
1bc: 02 c0 rjmp .+4 ; 0x1c2
1be: 95 95 asr r25
1c0: 87 95 ror r24
1c2: 0a 94 dec r0
1c4: e2 f7 brpl .-8 ; 0x1be
1c6: 80 ff sbrs r24, 0
1c8: f4 cf rjmp .-24 ; 0x1b2
/*
找出信号量等待列表中任务优先级最高的任务
*/
}
OSPrioHighRdy = OSNextTaskPrio;
1ca: 54 2e mov r5, r20
1cc: 08 95 ret
000001ce <OSSched>:
1ce: 0e 94 d4 00 call 0x1a8
1d2: 53 14 cp r5, r3
1d4: 11 f0 breq .+4 ; 0x1da
1d6: 0e 94 79 00 call 0xf2
1da: 08 95 ret
1dc: 08 95 ret
000001de <OSTaskSuspend>:
1de: 48 2f mov r20, r24
1e0: 0f b6 in r0, 0x3f ; 63
1e2: 0f 92 push r0
1e4: 11 24 eor r1, r1
1e6: f8 94 cli
1e8: 28 2f mov r18, r24
1ea: 33 27 eor r19, r19
1ec: f9 01 movw r30, r18
1ee: ee 0f add r30, r30
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -