这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 最新版本uC-OS2-2.93.01已移植到STC32G上,请帮忙查错

共1条 1/1 1 跳转至

最新版本uC-OS2-2.93.01已移植到STC32G上,请帮忙查错

菜鸟
2023-09-18 10:08:35     打赏

uCOS-II-2.93.01 for STC32G12K128 请帮忙查错
本移植参考STC论坛网友tzz1983的移植方案,使用定时器4模拟软件中断PendSv
一,使用注意:
本移植整个工程统一使用寄存器组0,用户不能修改寄存器组。寄存器组1,2,3共24字节用于data/edata区。
中断函数执行完毕,执行RETI返回前不建议关闭中断总开关。如果关闭一般认为是程序员的Bug。
系统启动前不能开中断,不然OSIntNesting一直会++。
二,void OSStartHighRdy(void)行数提供了3种方法切换到第一个任务。

  1. <font size="3">//方法1:使用ERET返回,返回前需要从新调整堆栈的内容,由于任务第一次运行,R4,R5,R6 给任何值都没关系。


  2.     //读取任务的SP

  3.     __asm   { MOV   DR4,OSTCBCur    }   

  4.     __asm   { MOV   WR2,@WR6+0x2    }   

  5.     __asm   { MOV   DR60,DR0        }

  6.    

  7.     //寄存器出栈

  8.     __asm   { POP   PSW     }               

  9.     __asm   { POP   DR0     }               

  10.     __asm   { POP   DR4     }               

  11.     __asm   { POP   DR8     }               

  12.     __asm   { POP   DR12    }               

  13.     __asm   { POP   DR16    }               

  14.     __asm   { POP   DR20    }               

  15.     __asm   { POP   DR24    }               

  16.     __asm   { POP   DR28    }               

  17.     __asm   { POP   DR56    }               


  18.     //PC和PSW1出栈

  19.     __asm   { POP   R4      }               

  20.     __asm   { POP   R6      }               

  21.     __asm   { POP   R5      }               

  22.     __asm   { POP   PSW1    }

  23.    

  24.     //把返回地址格式做成ERET的返回格试

  25.     __asm   { PUSH  R5    }               

  26.     __asm   { PUSH  R4    }               

  27.     __asm   { PUSH  R6    }

  28.     __asm   { SETB  EA      }

  29.     //用ERET指令转移到任务中去, 0XAA是ERET指令的编码

  30.     __asm   { DB    0AAH    }     


  31. //方法2:使用RETI返回,由于系统刚开始,其他中断都没有开始触发。用RETI完全没问题的。   

  32.    

  33.          //读取任务的SP

  34.     __asm   { MOV   DR4,OSTCBCur    }   

  35.     __asm   { MOV   WR2,@WR6+0x2    }   

  36.     __asm   { MOV   DR60,DR0        }

  37.    

  38.     //寄存器出栈

  39.     __asm   { POP   PSW     }               

  40.     __asm   { POP   DR0     }               

  41.     __asm   { POP   DR4     }               

  42.     __asm   { POP   DR8     }               

  43.     __asm   { POP   DR12    }               

  44.     __asm   { POP   DR16    }               

  45.     __asm   { POP   DR20    }               

  46.     __asm   { POP   DR24    }               

  47.     __asm   { POP   DR28    }               

  48.     __asm   { POP   DR56    }               

  49.     __asm   { SETB  EA      }

  50.     __asm   { RETI    }


  51. //方法3:使用PendSvIsr中断切换到第一个任务

  52. //巧妙指向DR0内存位置。SP保存到任务控制块的时候,实际操作是MOV   DR0,DR0,也就是DR0值不变     


  53.     OSTCBCur      = (OS_TCB *)0;   

  54.     PendSv_GenerateSWInterrupt();

  55.     EA = 1;

  56.     while(1);</font>

三,优化了OS_CPU_PendSVHandler中断函数

  1. <font size="3">void OS_CPU_PendSVHandler( void )

  2. {

  3.     //函数入口标号,中断跳转到入口标号,解决huge和large存储模式不一样函数名字不一样的问题。

  4.     __asm   {OS_CPU_PendSVHandler_00:  }

  5.     //寄存器入栈

  6.     __asm   { PUSH  DR56    }               

  7.     __asm   { PUSH  DR28    }               

  8.     __asm   { PUSH  DR24    }               

  9.     __asm   { PUSH  DR20    }               

  10.     __asm   { PUSH  DR16    }               

  11.     __asm   { PUSH  DR12    }               

  12.     __asm   { PUSH  DR8     }               

  13.     __asm   { PUSH  DR4     }               

  14.     __asm   { PUSH  DR0     }               

  15.     __asm   { PUSH  PSW     }

  16.    

  17.    

  18.     //SP保存到任务控制块                        

  19.     __asm   { MOV   DR0,DR60 }           

  20.     __asm   { MOV   DR4,OSTCBCur }   

  21.     __asm   { MOV   @WR6+0x2,WR2 }

  22.    

  23.    

  24.     //保存并关EA  ,其实EA=0问题也不大,如果中断返回的时候EA=0,这个很明显是程序员的bug

  25.     __asm   { SETB  C                }

  26.     __asm   { JBC   EA,PendSvIsr_01  }

  27.     __asm   { CLR   C                }

  28.     __asm   { PendSvIsr_01:          }

  29.     __asm   { PUSH  PSW              }


  30.     OSTaskSwHook();

  31.     OSPrioCur = OSPrioHighRdy;

  32.     OSTCBCur  = OSTCBHighRdy;


  33.     //恢复EA

  34.     __asm{  POP   PSW       }

  35.     __asm{   MOV   EA,C     }



  36.    

  37.     //读取任务的SP

  38. // ;OSTCBCur  = OSTCBHighRdy; 的汇编

  39. //        MOV      DR4,OSTCBHighRdy

  40. //        MOV      OSTCBCur,DR4

  41. //说明DR4的值已经是OSTCBCur,下面这条可以屏蔽

  42. //    __asm   { MOV   DR4,OSTCBCur    }   

  43.     __asm   { MOV   WR2,@WR6+0x2    }   

  44.     __asm   { MOV   DR60,DR0        }

  45.    

  46.     //寄存器出栈

  47.     __asm   { POP   PSW     }               

  48.     __asm   { POP   DR0     }               

  49.     __asm   { POP   DR4     }               

  50.     __asm   { POP   DR8     }               

  51.     __asm   { POP   DR12    }               

  52.     __asm   { POP   DR16    }               

  53.     __asm   { POP   DR20    }               

  54.     __asm   { POP   DR24    }               

  55.     __asm   { POP   DR28    }               

  56.     __asm   { POP   DR56    }               


  57.     //中断返回

  58.     __asm   { RETI }           

  59. }</font>

四,函数入口标号,中断跳转到入口标号,解决huge和large存储模式不同,函数名字不一样的问题。
/*-----------------------------------------------------------*
PendSv 向量入口引导
*-----------------------------------------------------------*/


__asm   {OS_CPU_PendSVHandler_00:  }


__asm   { CSEG    AT  PendSv_EntryAddress  }
__asm   { JMP     OS_CPU_PendSVHandler_00  }




附件是最新版本的源码:uCOSII-STC32G-V1.00.zip


需要设置全局可重入。昨天最后整理新建了工程,忘记设置了。




关键词: uC-OS2-2.93.01     STC32G    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]