以65170芯片为分析对象。其内存分配如下:
bc端向rt端发数过程
rt端软件部分读取bc端发送的遥控指令步骤为:
1.检测到新消息的中断。
2.0x0100中堆栈指针发生了变化,也就表示有新的消息描述符没有被处理。
3.从0x0000到0x00ff的描述符堆栈中,根据堆栈指针取出最新的消息描述符。
4.根据消息描述符里的“数据块指针”获取接收数据的存放地址,根据消息描述符里的“接受到的指令字”获取接收数据的字节数,然后就可以将bc发给rt的数据取出了。
bc端从rt端取数过程
rt端向bc端发送数据方式如下:
1.rt端将要发送的数据写入对应发送子地址的内存空间。
2.rt将发送子地址0的矢量字某一位置位,表示想发送某种类型的数据。
3.rt将状态字里的举手位置位,表示rt有数据要发给bc端。
4.bc在进行别的数据交互(如长抱环,遥控指令)等过程中获得状态字,并知晓rt端有数据要发送。
5.bc端读取rt端的矢量字,根据哪位置位了,得知rt端要发送哪个子地址的数据,然后从rt端发数据取走。
6.rt端获取了bc端取数的中断后,得知数据已经取走,则把矢量字清空。
rt端的初始化
rt端初始化主要是设置0x0140至0x01BF的查询表。
0x0140至0x015F用于设置每个接收子地址接收的数据存放在哪个存储区域。
0x0160至0x017F用于设置每个发送子地址发送的数据存放在哪个存储区域。
0x01A0至0x01BF用于设置每个发送子地址和接收子地址的存储区域可以存放多少数据,也叫子地址控制字。可以设置的数据量类型如下:
一些工作机理
查询表里存放的地址是给bc端从rt读数或写数时用的,读数会根据查询表里的地址值读数,写数会写入到查询表里的地址值对应位置,而且每次读完或写完数据,查询表中对应地址值会自动变成下一次读或写的地址。
子地址控制字设置了每个发送或接收子地址可以存放的数据量,当查询表中对应地址值更新时超出了子地址控制字设置的数据量后,地址值会变成初始地址,重新开始累计。
芯片判断查询表里的地址是否要更新成初始地址是通过判断某一位是否反转的方式。比如子地址控制字里设置某个子地址内存容量为128,那么芯片就会检测查询表里这个子地址对应的指针地址在累加过程中第7位是否发生了反转,如果反转了就将第0位到第7位清0重新计数。所以在初始化时设置查询表里的地址指针要字节数对齐。