标签:嵌入式系统开发,嵌入式开发,http://www.5idzw.com
MAXQ揭密,http://www.5idzw.com
前缀机制从两方面改善了这一操作过程。首先,这种机制仅向那些需要附加位的特定指令添加前缀,从而节省了代码空间与执行时间。其次,由于既可为立即数又可为寄存器标识符提供附加位,该机制在扩展寄存器空间的同时又保持了整体架构的性能。
前面提到,尽管每一个寄存器模块都包含32个寄存器,但源寄存器只有4位标识符,目标寄存器只有3位标识符。前缀机制则可提供这些附加位。
前缀机制的鲜明特色表现为几个方面。首先,前缀指令中目的部分的特定位被用作立即数源位,用来访问子译码大于15的源地址寄存器,以及子译码大于7的目的地址寄存器。通过这种方式,单条前缀指令既能够访问任何寄存器或立即数,也能够访问任何寄存器子译码。
其次,前缀寄存器还有另一个独特之处,即它载入的任意值仅能够保持一个时钟周期。在此之后,该寄存器会自动清零。也就是说,必须在紧靠被前缀寄存器修改的指令之前,向前缀寄存器传送所需数据。这同样意味着前缀指令是不可中断的。如果紧随一个前缀操作之后发生了一次中断,则当中断返回主函数时前缀信息会丢失。
如图9所示,前缀寄存器中的位分别送至源标识符、目的标识符和立即数中。所以,尽管绝大多数指令可以在单周期内执行,以下指令仍然需要两个周期:寻址子译码大于7的目标寄存器;寻址子译码大于15的源寄存器;或者加载大于255的立即数。

图9. 前缀寄存器可提供附加位,以实现16位立即操作数,以及寻址每个模块中所有32个源和目的寄存器。
为了说明这个过程,我们考虑指令move A[0], #010h。这条指令将一个立即数传送到模块9的寄存器0中,因此汇编器会生成如下的操作码:0910。但如果指令是A[10], #0320h的话,汇编器会自动地插入一条前缀指令:2B03 2920。
如果没有前缀指令,操作码2920会被解释为A[2], #020h。而前缀将一位添加到目的标识符,并将一些位添加到立即数中,从而允许处理器向任意寄存器子译码加载任意值,并且永远不会超过两个执行周期。
向量表中的最后一个入口地址用来重新初始化指针,并且任务调度器开始重新扫描向量表。
对于这个例子,假设该列表包含由标记、长度和数据串组成的数据对象。遍历该列表的程序如下:
,MAXQ揭密
前缀机制从两方面改善了这一操作过程。首先,这种机制仅向那些需要附加位的特定指令添加前缀,从而节省了代码空间与执行时间。其次,由于既可为立即数又可为寄存器标识符提供附加位,该机制在扩展寄存器空间的同时又保持了整体架构的性能。
前面提到,尽管每一个寄存器模块都包含32个寄存器,但源寄存器只有4位标识符,目标寄存器只有3位标识符。前缀机制则可提供这些附加位。
前缀机制的鲜明特色表现为几个方面。首先,前缀指令中目的部分的特定位被用作立即数源位,用来访问子译码大于15的源地址寄存器,以及子译码大于7的目的地址寄存器。通过这种方式,单条前缀指令既能够访问任何寄存器或立即数,也能够访问任何寄存器子译码。
其次,前缀寄存器还有另一个独特之处,即它载入的任意值仅能够保持一个时钟周期。在此之后,该寄存器会自动清零。也就是说,必须在紧靠被前缀寄存器修改的指令之前,向前缀寄存器传送所需数据。这同样意味着前缀指令是不可中断的。如果紧随一个前缀操作之后发生了一次中断,则当中断返回主函数时前缀信息会丢失。
如图9所示,前缀寄存器中的位分别送至源标识符、目的标识符和立即数中。所以,尽管绝大多数指令可以在单周期内执行,以下指令仍然需要两个周期:寻址子译码大于7的目标寄存器;寻址子译码大于15的源寄存器;或者加载大于255的立即数。

图9. 前缀寄存器可提供附加位,以实现16位立即操作数,以及寻址每个模块中所有32个源和目的寄存器。
为了说明这个过程,我们考虑指令move A[0], #010h。这条指令将一个立即数传送到模块9的寄存器0中,因此汇编器会生成如下的操作码:0910。但如果指令是A[10], #0320h的话,汇编器会自动地插入一条前缀指令:2B03 2920。
如果没有前缀指令,操作码2920会被解释为A[2], #020h。而前缀将一位添加到目的标识符,并将一些位添加到立即数中,从而允许处理器向任意寄存器子译码加载任意值,并且永远不会超过两个执行周期。
实例
独特的MAXQ20内核结构可以实现一些其它处理器不能完成的操作。向量中断
MAXQ20内核仅具有一个中断向量寄存器,一些用户可能认为这是一个缺陷。但实际情况是:考虑到具有两个外部中断的系统,可将其中的设备A连接至端口0位0,设备B连接至端口0位1;对应的中断选择可以像跳转PIO一样操作简单。在地址0上,编码为:0000: IRET 0001: jump SERVICE_DEVICE_A 0002: jump SERVICE_DEVICE_B 0003: jump SERVICE_DEVICE_A该例中,设备A具有中断服务优先权。也就是说,如果两个中断请求线同时有效(端口0上位0和位1均有效),先响应设备A。在中断服务程序结束时,只有当设备A中断不再有效时,才能够响应设备B中断。
任务管理器
在多数应用程序中,轮询任务列表非常重要,以便产生一个多任务处理环境下的原始数据类型。这点在无需优先权限时非常有用(或不需要实时操作的情况)。MAXQ结构简化了这种程序:task_wheel_init: move dp[0], #task_list task_wheel: move dp[0], dp[0] jump @dp[0]++ . . . task_list: dw task_01 dw task_02 dw task_03 dw task_wheel_init在该例子中,DP[0]指向任务列表。在task_wheel程序中,DP[0]被选中用来作为源指针,并接着从任务列表中加载指令指针。每当完成一个任务时,不是执行一个RET,而是简单地跳转至task_wheel程序即可。
向量表中的最后一个入口地址用来重新初始化指针,并且任务调度器开始重新扫描向量表。
遍历列表
通常,为做好标记的入口快速搜索非标准大小的对象是非常有用的。但对于某些处理器结构来说实现此功能是有困难的,因为其存储器访问功能已从ALU删除。在MAXQ中,这是一个非常简单的任务。TAG | LEN | Data | |||||||||||||
3F | 09 | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | |||||
17 | 0E | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A | 1B | 1C | 1D |
35 | 07 | 20 | 21 | 21 | 22 | 23 | 24 | 25 |
对于这个例子,假设该列表包含由标记、长度和数据串组成的数据对象。遍历该列表的程序如下:
item_seek: move acc, @dp[0]++ ;Get tag jump z, item_not_found ;Tag==0 means end of list cmp a[1] ;A[1] has target tag jump e, item_found ;If item==target, exit move acc, @dp[0]++ ;If no match, get data len add dp[0] ;Add to pointer move dp[0], acc ;Store pointer back jump item_seek ;...and seek next item.该程序8个指令遍历列表,寻找匹配项或标记为零的项,以此来终止列表。采用8MHz MAXQ20内核时,该程序每秒遍历一百万次。
结论
尽管MAXQ的内核看起来比较简单,但是传送-触发架构使得它在速度与灵活性方面具有突出的优势。由于通过寄存器接口直接寻址外设,嵌入式外设的数据传送速度极快。总的来说,MAXQ内核在任何方面都是大多数微控制器应用的上佳选择。,MAXQ揭密