RTOS和GUI_基于英飞凌tc2x及stm32开发板

etas OS源码最小系统及trace仿真环境搭建--Apple

2023-06-09  本文已影响0人  applecai

一,前言

最近也积累了些工作相关的比较感兴趣的话题,所以我就换换花样,从blender中先切出来,先研究下etas os源码,这也是我不小心发现的,原来安装老版本rtaoscfg.exe可以有15天的免费源码试用。里面可以生成3个example。书非借不能读也,抓紧学习etas os源码吧。虽然代码是老版本的,新版本无源码,但是估计也类似。这有利于我工作中黑盒调试,至少变量的含义可以搞清楚了,主要的汇编代码也可以方便的调试了。

二,os源码生成及最小工程搭建

生成源码就比较方便,首先生成example的配置,然后导入配置选择支持src生成即可,搭建最小工程也比较方便,先建立一个hightec自带的example环境,然后将src都替换入,最后setting中的link文件修改下,链接的参数修改下,主要要添加-e cstart,否则入口地址在链接文件中生成的是start函数名。

三,trace仿真环境搭建

要完成无硬件的tricore trace32仿真,需要导入一个设置了stm的dll文件来仿真支持stm及其stm中断。这个cmm在t32的demo文件夹中有,直接拿来用,然后load最小工程生成的elf就可以仿真了。
遇到的问题

  1. 卡在while等待相关只读reg的值。
    答:就把while注释掉即可继续跑,不影响os功能。

  2. hello工程只有2个basic的基于周期alarm的task,一个高优先级任务绑定在core1和一个低优先级任务绑定在core0。但是高优先级任务居然不会走到
    答:首先都在core0的时候运行是正常的,所以我先看看高优先级任务打断低优先级任务的切换代码逻辑。
    1)Os_ISRWrapper,stm0 1ms中断的硬件触发入口
    2)ISR(Millisecond),用户stm0中断函数,里面需要调用IncrementCounter。
    3)IncrementCounter(MillisecondCounter)会调用Os_IncrementCounter_MillisecondCounter,其中为sw的tick时间加1,然后进行周期alarm期望值match对比。同时match目标值又加一个cycle值作为下次match的目标alarm时间。对比相等,也就是alarm时间点到达了(比如10ms任务)就调用Os_ActivateTaskKL
    4)Os_ActivateTaskKL,目的是为任务就绪的ReadyTasks.P0 flag置1。
    5)回到Os_ISRWrapper中判断want_dispatch = (Os_ReadyTasks.p0 > Os_RunningTPMask.t0)只要就绪的优先级高于当前运行的优先级就切换任务Os_Dispatch。
    6)Os_RunningTask->entry_function()就会跳入用户高优先级task代码运行了。

  3. 调查core1的高优先级任务为什么不会走到。
    答:将os的高优先级任务再绑定到core1后,会看到Os_ActivateTaskKL中生成了代码,逻辑是当前运行的core不是core1,那么调用Os_RaiseCrossCoreISR(1U);函数。里面就是trigger一个gpsr01的中断。看了core1的BIV和中断初始化都是正确的,链接脚本int地址也无问题,但是为什么无法触发这个中断去调用os_disPatch1函数呢?看了IR模块的src中的gpsr寄存器,好像trigger后pengding没有置1,后来想了下应该是无硬件的仿真代码不支持c代码来触发除了stm以外的中断。所以我自己仿真下,添加了让其core1的PC指针指向os_disPatch1函数的地址,问题就解决了,core1的高优先级可以打断低优先级任务了。

FUNC(void, OS_CODE_FAST) Os_RaiseCrossCoreISR(CoreIdType core) {
  (*Os_CrossCoreSRCs[core]).U = Os_CrossCoreTriggers[core];
  (*Os_CrossCoreSRCs[core]).B.SETR = 1;  /* Trigger immediate */
  if(core == 1)
  {
      CPU1_PC.U = 0xa0010d6e;  /* addr of os_disPatch1,其实直接写函数名就代表此函数的地址也可以的*/
  }
}

四,小结
这个hello的基于alarm的basic task的os源码看起来很简单,之前仅知道理论alarm源自硬件时钟counter,alarm计数到后就运行任务。现在对应代码就是stm中断会对软件tick加1,软件tick到达alarm的match值后就设置任务就绪,然后判断就绪的任务优先级高于当前运行的任务就调用高优先级的任务进行运行了。果然看源码理解的更加清晰。也更加深刻的理解了为什么中断函数中一定要调用IncrementCounter(MillisecondCounter)函数。

上一篇 下一篇

猜你喜欢

热点阅读