请教:自己写的调度程序,任务定义的变量每次重新执行都

[复制链接]
2255|2
 楼主| linnaldf 发表于 2007-9-25 22:01 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;&nbsp;&nbsp;自己写的一个基于AVR单片机(Meag16)、编译器WINAVR20070122的调度程序,基于时间片轮转法,定时器0计时,轮流让8个任务运行,切换任务时保存全部寄存器R0-R31、SREG到当前任务的堆栽,然后恢复下一个任务的现场,用中断返回指令作任务切换。设置让编译器在中断程序不保存任何寄存器,由自己保存寄存器。<br />&nbsp;&nbsp;&nbsp;&nbsp;8个任务可以轮流运行,但是任务内部定义的局部在任务每次重新执行时都变为0。请教大家,谢谢了!程序代码如下:<br /><br />&nbsp;&nbsp;&nbsp;(1)头文件:任务控制块TCB定义、保存任务环境的入栽宏、恢复任务现场的出栽宏。<br />typedef&nbsp;struct<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char*&nbsp;task_stk_top;&nbsp;&nbsp;//保存任务的栽顶<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;task_stack[100];//任务堆栽<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}OS_TASK_TCB;<br /><br />//保存所有寄存器的宏<br />#define&nbsp;pushall()&nbsp;<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r1&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r0&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;in&nbsp;&nbsp;r0,&nbsp;0x3f&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);保存CPU状态寄存器<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r0&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;eor&nbsp;r1,&nbsp;r1&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);WINAVR要求R1等于0<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r2&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r3&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r4&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r5&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r6&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r7&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r8&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r9&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r10&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r11&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r12&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r13&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r14&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r15&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r16&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r17&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r18&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r19&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r20&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r21&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r22&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r23&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r24&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r25&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r26&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r27&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r28&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r29&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r30&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;push&nbsp;r31&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br /><br />//恢复任务现场时弹出所有寄存器的宏<br />#define&nbsp;popall()&nbsp;<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r31&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r30&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r29&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r28&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r27&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r26&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r25&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r24&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r23&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r22&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r21&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r20&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r19&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r18&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r17&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r16&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r15&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r14&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r13&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r12&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r11&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r10&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r9&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r8&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r7&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r6&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r5&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r4&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r3&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r2&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r0&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;out&nbsp;0x3f,&nbsp;r0&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);恢复CPU状态寄存器<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r0&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;pop&nbsp;r1&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />__asm__&nbsp;__volatile__&nbsp;(&quot;RETI&quot;&nbsp;&nbsp;&nbsp;&quot;
        &quot;);<br />//******************************************************************<br /><br />&nbsp;&nbsp;&nbsp;(2)主函数main()代码,包括8个任务,调度程序,定义8个任务,每个任务对应一个LED灯的闪烁:<br />#include&nbsp;&ltavr/io.h&gt<br />#include&nbsp;&ltutil/delay.h&gt<br />#include&nbsp;&ltavr/interrupt.h&gt<br />#include&nbsp;&quot;RTOS.h&quot;<br /><br />#define&nbsp;LED_PORT&nbsp;PORTA&nbsp;//LED端口定义<br />#define&nbsp;LED_DDR&nbsp;&nbsp;DDRA<br />#define&nbsp;LED_PIN&nbsp;&nbsp;PINA<br /><br />//第1个任务定义<br />void&nbsp;task1(&nbsp;void&nbsp;)<br />{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;temp&nbsp;;//任务1的局部变量<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;TCCR0&nbsp;=&nbsp;0X05;//定时器0初始化<br />&nbsp;&nbsp;&nbsp;&nbsp;TIMSK&nbsp;=&nbsp;0X01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;TCNT0&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;sei();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开全局中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//任务1每次重新执行temp都会变为0,就是这里请教大家为什么?<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp++;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LED_PORT&nbsp;^=0X01;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;unsigned&nbsp;char&nbsp;i=0;&nbsp;i&lt250;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;_delay_ms(10);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />//第2个任务定义<br />void&nbsp;task2(void)<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LED_PORT&nbsp;^=0X02;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;unsigned&nbsp;char&nbsp;i=0;&nbsp;i&lt250;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;_delay_ms(10);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />//第3个任务定义<br />void&nbsp;task3(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LED_PORT&nbsp;^=0X04;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;unsigned&nbsp;char&nbsp;i=0;&nbsp;i&lt250;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;_delay_ms(10);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />//第4个任务定义<br />void&nbsp;task4(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LED_PORT&nbsp;^=0X08;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;unsigned&nbsp;char&nbsp;i=0;&nbsp;i&lt250;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;_delay_ms(10);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />//第5个任务定义<br />void&nbsp;task5(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LED_PORT&nbsp;^=0X10;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;unsigned&nbsp;char&nbsp;i=0;&nbsp;i&lt250;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;_delay_ms(10);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />//第6个任务定义<br />void&nbsp;task6(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LED_PORT&nbsp;^=0X20;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;unsigned&nbsp;char&nbsp;i=0;&nbsp;i&lt250;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_delay_ms(10);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />//第7个任务定义<br />void&nbsp;task7(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LED_PORT&nbsp;^=0X40;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;unsigned&nbsp;char&nbsp;i=0;&nbsp;i&lt250;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;_delay_ms(10);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />//第8个任务定义<br />void&nbsp;task8(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LED_PORT&nbsp;^=0X80;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(&nbsp;unsigned&nbsp;char&nbsp;i=0;&nbsp;i&lt250;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_delay_ms(10);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />//*******************************************************************<br /><br />volatile&nbsp;unsigned&nbsp;char&nbsp;next_task&nbsp;=&nbsp;0;//用来计算下一个运行的任务<br /><br />//计数变量,在定时器0中断函数里加1,用来控制任务切换频率<br />volatile&nbsp;unsigned&nbsp;char&nbsp;count&nbsp;=&nbsp;0;<br /><br />volatile&nbsp;OS_TASK_TCB&nbsp;task_tcb[&nbsp;8&nbsp;];//定义8个任务的任务控制块TCB数组<br /><br />//任务堆栽初始化函数,参数为:任务入口地址、任务序号(1-8)<br />unsigned&nbsp;char*&nbsp;stackinit(&nbsp;void&nbsp;(*task)(&nbsp;void&nbsp;),&nbsp;unsigned&nbsp;char&nbsp;task_id&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char*&nbsp;stk;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;temp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;(unsigned&nbsp;int)task;//任务入口地址&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;stk&nbsp;=&nbsp;&(&nbsp;task_tcb[task_id].task_stack[99]&nbsp;);//取得任务栽顶指针<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)(temp&0xff);//将任务入口地址入栽<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)(temp&gt&gt8);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//以下是CPU所有寄存器初始化,为0值,<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R0&nbsp;&nbsp;=&nbsp;0x00&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R1&nbsp;&nbsp;=&nbsp;0x00&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x80;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R2&nbsp;&nbsp;=&nbsp;0x00&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R3&nbsp;&nbsp;=&nbsp;0x00&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R4&nbsp;&nbsp;=&nbsp;0x00&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R5&nbsp;&nbsp;=&nbsp;0x00&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R6&nbsp;&nbsp;=&nbsp;0x00&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R7&nbsp;&nbsp;=&nbsp;0x00&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R8&nbsp;&nbsp;=&nbsp;0x00&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R9&nbsp;&nbsp;=&nbsp;0x00&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R10&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R11&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R12&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R13&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R14&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R15&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R16&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R17&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R18&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R19&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R20&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R21&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R22&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R23&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R24&nbsp;=&nbsp;0x00&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R25&nbsp;=&nbsp;0x00&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R26&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R27&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R28&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R29&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R30&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;R31&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;*stk--&nbsp;=&nbsp;(unsigned&nbsp;char)0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;SREG&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(&nbsp;(unsigned&nbsp;char*)stk&nbsp;);//返回当前堆栈指针<br />}<br /><br />//任务创建函数:<br />void&nbsp;taskcreat(&nbsp;void&nbsp;(*task)(&nbsp;void&nbsp;),&nbsp;unsigned&nbsp;char&nbsp;task_id&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;*temp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;stackinit(&nbsp;task,&nbsp;task_id&nbsp;);//堆栽初始化,并返回栽顶指针<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//初始化之后将堆栽栽顶指针保存在任务的TCB里,这个变量一直指向栽顶<br />&nbsp;&nbsp;&nbsp;&nbsp;task_tcb[task_id].task_stk_top&nbsp;=&nbsp;temp;<br />}<br /><br />void&nbsp;OS_Start(&nbsp;void&nbsp;)<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SP&nbsp;=&nbsp;task_tcb[0].task_stk_top&nbsp;+&nbsp;33;//堆栽指针指向第一个任务<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//用中断返回指令将入口地址弹出到PC指针,运行第一个任务<br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;RETI&quot;);<br />}<br /><br />//定时器0的中断函数:加上下面这句,WINAVR将不保存任何寄存器<br />void&nbsp;SIG_OVERFLOW0(&nbsp;void&nbsp;)&nbsp;__attribute__&nbsp;(&nbsp;(&nbsp;signal,&nbsp;naked&nbsp;)&nbsp;);<br />SIGNAL(&nbsp;SIG_OVERFLOW0&nbsp;)&nbsp;<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pushall(&nbsp;);//自己人工保存所有寄存器<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;count++;&nbsp;&nbsp;&nbsp;//每次中断加1<br />&nbsp;&nbsp;&nbsp;&nbsp;if(count&gt100)//100时任务切换,count值可以调整任务切换频率<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;=&nbsp;0;//重新清0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_task++;指向下一个任务<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//堆栽指针指向下一个任务栽顶<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SP&nbsp;=&nbsp;task_tcb[&nbsp;next_task&nbsp;%&nbsp;8&nbsp;].task_stk_top;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;popall(&nbsp;);//人工恢复所有寄存器<br />}<br /><br />//main()函数<br />int&nbsp;main(&nbsp;void&nbsp;)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//LED灯控制端口设置<br />&nbsp;&nbsp;&nbsp;&nbsp;LED_PORT=0Xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;LED_DDR&nbsp;=0Xff;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//创建并初始化8个任务<br />&nbsp;&nbsp;&nbsp;&nbsp;taskcreat(&nbsp;task1,&nbsp;0&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;taskcreat(&nbsp;task2,&nbsp;1&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;taskcreat(&nbsp;task3,&nbsp;2&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;taskcreat(&nbsp;task4,&nbsp;3&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;taskcreat(&nbsp;task5,&nbsp;4&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;taskcreat(&nbsp;task6,&nbsp;5&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;taskcreat(&nbsp;task7,&nbsp;6&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;taskcreat(&nbsp;task8,&nbsp;7&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_Start(&nbsp;);//开始运行任务<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;1&nbsp;);&nbsp;&nbsp;&nbsp;<br />}//****************************************************************<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;我的问题就是任务1内部定义的局部变量temp为什么每次在任务1重新执行都为从0开始。这个时自己学习RTOS写的,请大家多指教!我想不断的进步,谢谢了!<br />&nbsp;&nbsp;&nbsp;&nbsp;祝大家中秋快乐,工作顺心,呵呵!
dld2 发表于 2007-9-26 14:34 | 显示全部楼层

用反汇编看一下,temp的地址是否发生变化

没有仔细看。<br />任务切换时上一个任务的栈指针保存到TCB的task_stk_top了吗?
 楼主| linnaldf 发表于 2007-9-26 20:48 | 显示全部楼层

谢谢 dld2 ,忘记保存堆栈指针,现在正确了

thinks&nbsp;you!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

70

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部