|
发表于 2019-11-24 15:27:38
|
显示全部楼层
本帖最后由 cnxh 于 2019-11-24 15:31 编辑
我改了一下,avr汇编不会,
原在raysrtos.c 中SP=TCB[OSPrioCur].OSTCBStkPtr+33; //将栈顶移到pc位置,准备弹出,
第一个任务进入函数功能: 任务级切换函数 void OSSched(void),后返回会直接复位,因为第2个函数的栈顶被设置到了TCB[OSPrioCur].OSTCBStkPtr+33,此处不是第二个任务的入口,
把SP=TCB[OSPrioCur].OSTCBStkPtr+33,改成SP=TCB[OSPrioCur].OSTCBStkPtr,切换任务函数返回,可以跳转到第2个任务函数开始,不加别的东西我测试了一下可以运行,加入自己的任务后会复位
这是我改的iar的堆栈保护,不知道对不对
******************全局变量定义***************/
extern struct TaskCtrBlock TCB[OS_TASKS + 1]; // 定义任务控制块
extern INT8U OSPrioCur; // 正在运行的任务
extern INT8U OSPrioHighRdy; // 更高优先级的任务
extern INT16U *TEMP_SP;
/*
+---------------------------------------------------------------------------------------+
|函数名称: OSSched |
|---------------------------------------------------------------------------------------|
|函数原型: void OSSched(prio) |
| |
|函数功能: 任务级切换函数 | |
+---------------------------------------------------------------------------------------+
*/
void OSSched(void)
{
OS_ENTER_CRITICAL(); //关中断
if(OSPrioHighRdy != OSPrioCur) // 如果不是当前运行的任务,进行任务调度 */
{
//push all
// __asm__ __volatile__("PUSH __zero_reg__ \n\t"); //R1
// __asm__ __volatile__("PUSH __tmp_reg__ \n\t"); //R0
// __asm__ __volatile__("IN __tmp_reg__,__0x3F__ \n\t"); //保存状态寄存器0x3F
// __asm__ __volatile__("PUSH __tmp_reg__ \n\t");
// __asm__ __volatile__("CLR __zero_reg__ \n\t"); //R1重新清零
// __asm__ __volatile__("PUSH R18 \n\t");
// __asm__ __volatile__("PUSH R19 \n\t");
// __asm__ __volatile__("PUSH R20 \n\t");
// __asm__ __volatile__("PUSH R21 \n\t");
// __asm__ __volatile__("PUSH R22 \n\t");
// __asm__ __volatile__("PUSH R23 \n\t");
// __asm__ __volatile__("PUSH R24 \n\t");
// __asm__ __volatile__("PUSH R25 \n\t");
// __asm__ __volatile__("PUSH R26 \n\t");
// __asm__ __volatile__("PUSH R27 \n\t");
// __asm__ __volatile__("PUSH R30 \n\t");
// __asm__ __volatile__("PUSH R31 \n\t");
// __asm__ __volatile__("PUSH R2 \n\t");
// __asm__ __volatile__("PUSH R3 \n\t");
// __asm__ __volatile__("PUSH R4 \n\t");
// __asm__ __volatile__("PUSH R5 \n\t");
// __asm__ __volatile__("PUSH R6 \n\t");
// __asm__ __volatile__("PUSH R7 \n\t");
// __asm__ __volatile__("PUSH R8 \n\t");
// __asm__ __volatile__("PUSH R9 \n\t");
// __asm__ __volatile__("PUSH R10 \n\t");
// __asm__ __volatile__("PUSH R11 \n\t");
// __asm__ __volatile__("PUSH R12 \n\t");
// __asm__ __volatile__("PUSH R13 \n\t");
// __asm__ __volatile__("PUSH R14 \n\t");
// __asm__ __volatile__("PUSH R15 \n\t");
// __asm__ __volatile__("PUSH R16 \n\t");
// __asm__ __volatile__("PUSH R17 \n\t");
// __asm__ __volatile__("PUSH R28 \n\t"); //R28与R29用于建立在堆栈上的指针
// __asm__ __volatile__("PUSH R29 \n\t"); //入栈完成
//PUSH_ALL ; Save current task's context
//iar中断保存
asm("ST -Y,R27");
asm("ST -Y,R26");
asm("ST -Y,R25");
asm("ST -Y,R24");
asm("ST -Y,R31");
asm("ST -Y,R30");
asm("ST -Y,R3");
asm("ST -Y,R2");
asm("ST -Y,R1");
asm("ST -Y,R0");
asm("ST -Y,R23");
asm("ST -Y,R22");
asm("ST -Y,R21");
asm("ST -Y,R20");
asm("ST -Y,R19");
asm("ST -Y,R18");
asm("ST -Y,R17");
asm("ST -Y,R16");
asm("IN R24,0x3F");
asm("IN R25,0x3B");
//iar中断一样无保存的
asm("ST -Y,R4");
asm("ST -Y,R5");
asm("ST -Y,R6");
asm("ST -Y,R7");
asm("ST -Y,R8");
asm("ST -Y,R9");
asm("ST -Y,R10");
asm("ST -Y,R11");
asm("ST -Y,R12");
asm("ST -Y,R13");
asm("ST -Y,R14");
asm("ST -Y,R15");
asm("ST -Y,R28");
asm("ST -Y,R29");
//
SPPoint();
*TEMP_SP=SP; //保存当前堆栈指针
OSPrioCur = OSPrioHighRdy; // 更新OSPrioCur
SPPoint();
SP=*TEMP_SP; //任务堆栈指针切换
//pop all
// __asm__ __volatile__("POP R29 \n\t");
// __asm__ __volatile__("POP R28 \n\t");
// __asm__ __volatile__("POP R17 \n\t");
// __asm__ __volatile__("POP R16 \n\t");
// __asm__ __volatile__("POP R15 \n\t");
// __asm__ __volatile__("POP R14 \n\t");
// __asm__ __volatile__("POP R13 \n\t");
// __asm__ __volatile__("POP R12 \n\t");
// __asm__ __volatile__("POP R11 \n\t");
// __asm__ __volatile__("POP R10 \n\t");
// __asm__ __volatile__("POP R9 \n\t");
// __asm__ __volatile__("POP R8 \n\t");
// __asm__ __volatile__("POP R7 \n\t");
// __asm__ __volatile__("POP R6 \n\t");
// __asm__ __volatile__("POP R5 \n\t");
// __asm__ __volatile__("POP R4 \n\t");
// __asm__ __volatile__("POP R3 \n\t");
// __asm__ __volatile__("POP R2 \n\t");
// __asm__ __volatile__("POP R31 \n\t");
// __asm__ __volatile__("POP R30 \n\t");
// __asm__ __volatile__("POP R27 \n\t");
// __asm__ __volatile__("POP R26 \n\t");
// __asm__ __volatile__("POP R25 \n\t");
// __asm__ __volatile__("POP R24 \n\t");
// __asm__ __volatile__("POP R23 \n\t");
// __asm__ __volatile__("POP R22 \n\t");
// __asm__ __volatile__("POP R21 \n\t");
// __asm__ __volatile__("POP R20 \n\t");
// __asm__ __volatile__("POP R19 \n\t");
// __asm__ __volatile__("POP R18 \n\t");
// __asm__ __volatile__("POP __tmp_reg__ \n\t"); //SERG 出栈并恢复
// __asm__ __volatile__("OUT __0x3F__,__tmp_reg__ \n\t");
// __asm__ __volatile__("POP __tmp_reg__ \n\t"); //R0 出栈
// __asm__ __volatile__("POP __zero_reg__ \n\t"); //R1 出栈
//iar中断一样无保存的
asm("LD R29,Y+");
asm("LD R28,Y+");
asm("LD R15,Y+");
asm("LD R14,Y+");
asm("LD R13,Y+");
asm("LD R12,Y+");
asm("LD R11,Y+");
asm("LD R10,Y+");
asm("LD R9,Y+");
asm("LD R8,Y+");
asm("LD R7,Y+");
asm("LD R6,Y+");
asm("LD R5,Y+");
asm("LD R4,Y+");
//iar中断一样
asm("IN R25,0x3B");
asm("IN R24,0x3F");
asm("LD R16,Y+");
asm("LD R17,Y+");
asm("LD R18,Y+");
asm("LD R19,Y+");
asm("LD R20,Y+");
asm("LD R21,Y+");
asm("LD R22,Y+");
asm("LD R23,Y+");
asm("LD R0,Y+");
asm("LD R1,Y+");
asm("LD R2,Y+");
asm("LD R3,Y+");
asm("LD R30,Y+");
asm("LD R31,Y+");
asm("LD R24,Y+");
asm("LD R25,Y+");
asm("LD R26,Y+");
asm("LD R27,Y+");
}
OS_EXIT_CRITICAL(); //开中断
}
/*
+---------------------------------------------------------------------------------------+
|函数名称: void OSTimeTick(void) |
|---------------------------------------------------------------------------------------|
|函数原型: void OSTimeTick(void) |
| |
|函数功能: 中断级切换函数 | |
+---------------------------------------------------------------------------------------+
*/
void OSTimeTick(void)
{
OS_ENTER_CRITICAL();; //关中断
//push all 除了中断自动保存的寄存器
// __asm__ __volatile__("PUSH R2 \n\t");
// __asm__ __volatile__("PUSH R3 \n\t");
// __asm__ __volatile__("PUSH R4 \n\t");
// __asm__ __volatile__("PUSH R5 \n\t");
// __asm__ __volatile__("PUSH R6 \n\t");
// __asm__ __volatile__("PUSH R7 \n\t");
// __asm__ __volatile__("PUSH R8 \n\t");
// __asm__ __volatile__("PUSH R9 \n\t");
// __asm__ __volatile__("PUSH R10 \n\t");
// __asm__ __volatile__("PUSH R11 \n\t");
// __asm__ __volatile__("PUSH R12 \n\t");
// __asm__ __volatile__("PUSH R13 \n\t");
// __asm__ __volatile__("PUSH R14 \n\t");
// __asm__ __volatile__("PUSH R15 \n\t");
// __asm__ __volatile__("PUSH R16 \n\t");
// __asm__ __volatile__("PUSH R17 \n\t");
// __asm__ __volatile__("PUSH R28 \n\t"); //R28与R29用于建立在堆栈上的指针
// __asm__ __volatile__("PUSH R29 \n\t"); //入栈完成
//asm("ST -Y,R2");
// asm("ST -Y,R3");
asm("ST -Y,R4");
asm("ST -Y,R5");
asm("ST -Y,R6");
asm("ST -Y,R7");
asm("ST -Y,R8");
asm("ST -Y,R9");
asm("ST -Y,R10");
asm("ST -Y,R11");
asm("ST -Y,R12");
asm("ST -Y,R13");
asm("ST -Y,R14");
asm("ST -Y,R15");
asm("ST -Y,R28");
asm("ST -Y,R29");
TickIntHook();
SPPoint();
*TEMP_SP=SP; //保存当前堆栈指针
// asm("IN R16,0x3E");
// asm("ST -Y,R16");
// asm("IN R16,0x3D");
// asm("ST -Y,R16");
OSPrioCur = OSPrioHighRdy; // 更新OSPrioCur
SPPoint();
SP=*TEMP_SP; //任务堆栈指针切换
// asm("LD R16,Y+");//sp
// asm("OUT 0x3D,R16");
// asm("LD R16,Y+");
// asm("OUT 0x3E,R16");
//pop all 除了中断自动保存的寄存器
// __asm__ __volatile__("POP R29 \n\t");
// __asm__ __volatile__("POP R28 \n\t");
// __asm__ __volatile__("POP R17 \n\t");
// __asm__ __volatile__("POP R16 \n\t");
// __asm__ __volatile__("POP R15 \n\t");
// __asm__ __volatile__("POP R14 \n\t");
// __asm__ __volatile__("POP R13 \n\t");
// __asm__ __volatile__("POP R12 \n\t");
// __asm__ __volatile__("POP R11 \n\t");
// __asm__ __volatile__("POP R10 \n\t");
// __asm__ __volatile__("POP R9 \n\t");
// __asm__ __volatile__("POP R8 \n\t");
// __asm__ __volatile__("POP R7 \n\t");
// __asm__ __volatile__("POP R6 \n\t");
// __asm__ __volatile__("POP R5 \n\t");
// __asm__ __volatile__("POP R4 \n\t");
// __asm__ __volatile__("POP R3 \n\t");
// __asm__ __volatile__("POP R2 \n\t");
//iar中断一样无保存的
asm("LD R29,Y+");
asm("LD R28,Y+");
asm("LD R15,Y+");
asm("LD R14,Y+");
asm("LD R13,Y+");
asm("LD R12,Y+");
asm("LD R11,Y+");
asm("LD R10,Y+");
asm("LD R9,Y+");
asm("LD R8,Y+");
asm("LD R7,Y+");
asm("LD R6,Y+");
asm("LD R5,Y+");
asm("LD R4,Y+");
OS_EXIT_CRITICAL(); //开中断
}
|
|