全部学习汇总: ​​GreyZhang/g_TC275: happy hacking for TC275! (github.com)​

原本计划继续向前推进,看一下全新的例子。后来看了一下,现在的软件中还有一个同步接口没有分析,这样把最后的这部分遗憾弥补掉。

1479_英飞凌AURIX TC275 iLLD例子中的CPU同步实现分析_TC275

这个是比较原始的一个CPU同步实现的分析,这个接口在三个CPU的main函数中全都出现了一次。为了能够观察一下这个过程发生了什么,我增加了一系列的全局变量来存储中间的状态信息。

1479_英飞凌AURIX TC275 iLLD例子中的CPU同步实现分析_AURIX_02

上面是增加后的信息,一个是在同步信号发出的地方记录相关的变量信息值,一个是在同步发生之后。

1479_英飞凌AURIX TC275 iLLD例子中的CPU同步实现分析_单片机_03

上面是CPU0的测试代码。

1479_英飞凌AURIX TC275 iLLD例子中的CPU同步实现分析_单片机_04

以上是CPU1的测试代码。

1479_英飞凌AURIX TC275 iLLD例子中的CPU同步实现分析_嵌入式_05

以上是CPU2的测试代码。

1479_英飞凌AURIX TC275 iLLD例子中的CPU同步实现分析_赋值_06

之后,在CPU0的主函数中把相应的信息打印出来。

1479_英飞凌AURIX TC275 iLLD例子中的CPU同步实现分析_单片机_07

以上是打印出来的结果,设置之后,相应的数值一次变成了1、3、7。那么,这样的数值有什么含义呢?接下来做代码的分析。

1479_英飞凌AURIX TC275 iLLD例子中的CPU同步实现分析_嵌入式_08

1479_英飞凌AURIX TC275 iLLD例子中的CPU同步实现分析_赋值_09

1479_英飞凌AURIX TC275 iLLD例子中的CPU同步实现分析_TC275_10

这个接口函数的执行需要结合tasking的编译器手册来理解,因为这里面最终用到了一个编译器内置的指令。具体的功能就是修改指定地址的位信息,但是需要有对齐要求。

结合上面的信息,针对这个全局变量,Core写了bit0、Core1写了bit1、Core2写了bit2。这样的现象,跟看到的打印信息是吻合的。接下来,看看下面的等待事件的接口实现。

1479_英飞凌AURIX TC275 iLLD例子中的CPU同步实现分析_AURIX_11

其实,等待的这个函数实现是很容易理解的。第一行定义赋值先放一下,后面的信息比较容易一下子看明白。那就是,每一个CPU都检查一下,刚刚看的赋值过程是否生效了。如果所有的CPU都赋值了,那么说明大家都到了这个执行点。如果超时了依然没有到,那么需要返回一个错误码。当然,这里的错误码是没有返回测试的,后面还得尝试测试一下。

1479_英飞凌AURIX TC275 iLLD例子中的CPU同步实现分析_赋值_12

这个超长的代码实现的额功能其实是一个地址转换,转换的机制很容易理解。就是做了一个偏移,而不同的Core之间又有一个固定的地址空间偏移。这里,对此做了统一的处理。当然,如果地址空间本来就是可以通过共享总线来进行访问的,那么这个偏移转换也就不会实质生效了。

1479_英飞凌AURIX TC275 iLLD例子中的CPU同步实现分析_AURIX_13

现在,在每一个CPU的函数中增加了这样的一个状态获取,之后打印一下看看三个CPU中的操作成功与否信息。

1479_英飞凌AURIX TC275 iLLD例子中的CPU同步实现分析_单片机_14

以上是打印结果,看起来全都是没有出错的。

1479_英飞凌AURIX TC275 iLLD例子中的CPU同步实现分析_嵌入式_15

从上面的结果看,这个地址暂时没有出现0xd开头的,说明现在的变量是可以在共享总线上直接访问的。

一气儿分析了好几部分的内容,真是感觉到了时间的飞逝如同白驹过隙。现在回头想想,不知道多少个如同今天的周末在不知不觉中消耗完了。其实,工作的时间已经够多了,以后周末多出去走动走动多带带娃或许是更好的调剂。