美文网首页RTOS和GUI_基于英飞凌tc2x及stm32开发板
自建os最小工程实战—Apple的学习笔记

自建os最小工程实战—Apple的学习笔记

作者: applecai | 来源:发表于2023-06-16 16:47 被阅读0次

一,前言

看了3个OS example源码及配置,os用户手册也快速的过了下,主要是链接脚本的中断段地址要加入,否则BIV的中断入口地址会不正确。直接用example编译的工程可以sim正常的跑,自己基于mcal移植了hello demo中的os也可以sim正常的跑,那么今天就从空白建立一个os配置,然后让它通过T32 sim正常跑起来吧

二,遇到的问题

  1. 问题描述:调度表的任务一个都没跑起来。
    自己从空白建立了4个周期task的调度表和一个单次的初始化alarmTask
    共5个task,每个task中加了taskcnt,结果只有alarmTask跑过一次。调度表的task都没调用,但是1ms中断是正确进入,空闲任务也正确。
  2. 问题分析:发现任务没有就绪,match值一直为0
    os调度任务的思路首先是sw tick中的match匹配后设置就绪flag,然后选一个优先级高的进行任务运行。那么就先看任务就绪flag是否被置起。

a. 通过源码调试得知任务没有被设置为就绪,解决方案是调用StartScheduleTableRel
进入sw tick中断去调试,已经都进入第3次了,调度表中的match值一直是0,见下图。这就是根本原因,我查了下调度器启动我设置了的是relative,User Guide中搜索这个关键字,就找到了需要调用StartScheduleTableRel或者SetRelAlarm来启动,所以对于设置相对时间的,需要再加1个启动函数应该就可以解决了。
结果函数加完,依然match值没有变化,原因是调度表已经启动了。


image.png

调度表在哪里启动的,重新reset为写入此变量的地方打断点,原来是autosar的时候调用的,但是match等参数传递的都是0。


image.png
FUNC(void, OS_CODE) Os_StartOS_StartAuto(void) {

  (void)SetAbsAlarm((AlarmType)(0), (TickType)1U, (TickType)0U);
  (void)StartScheduleTableRel((&Os_const_scheduletables[0]), (TickType)0U);
} 

b. 问题分析:设计问题,配置的相对启动时间值不合理,不能为0。
也就是因为我配置了auto start,所以不需要手工调用了,但是配置的值init+offset总和不能是0,而我调度表设置的是0,EP的第一个点也是0。因为Os_IncrementCounter_TickCounter1ms函数一进入就会为sw tick加1,所以0永远不会match,若一次没match上,那就不会再设置下一次match的条件了。
手册里面也没说不能设置为0,设置0我理解是立刻的意思,现在看来设置1才是立刻的意思。
有2个解决方法
调度表的相对启动时间设置为1,另外一种方法就是不设置autostart,然后手工调用函数,参数也需要设置从1开始。
这2种方法都可以解决问题,观察taskcnt,各个task进入的时间正确。

image.png

三,小结

我都是无板调试哦(上图写了SIM),这最适合在家学习了。说明已经找到了学习autosar os的正确方法(安装包的help文档及demo,我自己做的mcal最小工程中集成OS源码,T32的sim调试cmm脚本。全套在家练习的环境已经搭建完毕。我喜欢这种白手起家从0开始的感觉)。光看理论纸上谈兵是不能精通的,必须要闭环验证,实践出真知。

相关文章

网友评论

    本文标题:自建os最小工程实战—Apple的学习笔记

    本文链接:https://www.haomeiwen.com/subject/gkvrydtx.html