| 硬件中断 | 软件中断 | 任务 |
触发 | 外部异步事件 | SWI函数 | TSK模块,动态调度抢占 |
优先级 | 最高 | 高 | 次高 |
主要特征 | 200Khz左右,应对硬件信号进行响应,时间要求苛刻,步骤简单,处理快速,非阻塞程序 | 100ms以上事件,除非被更高级别中断抢占,会一直执行至完毕 | 拥有多任务间通信和同步手段,一个任务可以挂起等待某一资源的有效 |
堆栈使用 | 使用系统栈 | 使用系统栈 | 每个任务具有自己大运行时栈,用于保存局部变量和调用嵌套函数 |
优点 | 响应快,应对关键任务 | 时间要求不苛刻,减少了中断禁止时间,中断函数相对独立 | 时间要求不苛刻,减少了中断禁止时间,中断函数要求复杂,更有效利用共享数据 |
其他注解 | CLK函数,每个定时器中断末尾执行 | PRD函数,定时器中断或其他事件多次计数后执行 | 拥有队列,信号灯,邮箱等机制用于任务间同步和通信 |
2008年12月15日星期一
TI DSP/BIOS线程比较
TI的DSP的动态加载
动态加载是TI CCS提高运行速度的比较有用的工具, 特别是在具有多个互斥功能实现(不同时运行)的时候, 以及从rom/flash中加载应用,以及启动的时候.
动态加载说到底就是预先进行了重新位, 里面所有的跳转和调用语句都是按照运行位置进行编译的, 而不是按照load位置. 这样, 我们可以将程序放在任何地方,甚至硬盘里面, 到时候需要的时候, 只要加载到固定的位置即可.因此, 可以建立一种类似于传统的OS. 只是有很多限制.
这一点和传统的操作系统有不同的地方就是: 传统的操作系统加载的文件一般都有重定位表, 在加载的时候,需要将这个重定位表中每一项所对应的位置地方的偏移量(一般都是绝对偏移)等按照当前实际位置进行修改;对于具有export 函数功能的文件, 可能需要建立一个表格, 甚至修改系统的函数入口地址映射表, 这样别的文件才能找到当前加载的函数.
动态加载有三种方法: 在CCS2.2之后,一般采用cmd文件中定义union和group的方法来建立各个动态加载项的run位置和load位置,以及各自大小. 这种方式需要我们采用DMA的方式进行手动将需要的程序段加载到运行区域. 而在ccs3.0里面,提出了一种更简洁的建立这个run和load位置的方法, 并且提供相应的传输函数. 这些都很类似.
有一点值得指出: 在函数中使用的时候, 必须定义成指针的形式, 否则将找不到定义的符号.
动态加载说到底就是预先进行了重新位, 里面所有的跳转和调用语句都是按照运行位置进行编译的, 而不是按照load位置. 这样, 我们可以将程序放在任何地方,甚至硬盘里面, 到时候需要的时候, 只要加载到固定的位置即可.因此, 可以建立一种类似于传统的OS. 只是有很多限制.
这一点和传统的操作系统有不同的地方就是: 传统的操作系统加载的文件一般都有重定位表, 在加载的时候,需要将这个重定位表中每一项所对应的位置地方的偏移量(一般都是绝对偏移)等按照当前实际位置进行修改;对于具有export 函数功能的文件, 可能需要建立一个表格, 甚至修改系统的函数入口地址映射表, 这样别的文件才能找到当前加载的函数.
动态加载有三种方法: 在CCS2.2之后,一般采用cmd文件中定义union和group的方法来建立各个动态加载项的run位置和load位置,以及各自大小. 这种方式需要我们采用DMA的方式进行手动将需要的程序段加载到运行区域. 而在ccs3.0里面,提出了一种更简洁的建立这个run和load位置的方法, 并且提供相应的传输函数. 这些都很类似.
有一点值得指出: 在函数中使用的时候, 必须定义成指针的形式, 否则将找不到定义的符号.
DM642的中断处理
1.非NMI中断的发生的前提:GIE=1,NMIE=1,IER中对应的标记位,还有就是DEVICE中的使能位
2.当非NMI中断的发生的时候,自动清楚GIE,保存到PGIE中,退出采用B IRP,会自动恢复GIE
3.中断的能够发生位置:Single Assignment vs. Multiple Assignment:只有在single assignment才能发生中断
另外:TI DSP的printf问题
1. printf可能会打破互斥的功能,导致互斥失败。
2.当非NMI中断的发生的时候,自动清楚GIE,保存到PGIE中,退出采用B IRP,会自动恢复GIE
3.中断的能够发生位置:Single Assignment vs. Multiple Assignment:只有在single assignment才能发生中断
另外:TI DSP的printf问题
1. printf可能会打破互斥的功能,导致互斥失败。
DSP中的EDMA
EDMA可以在没有DSP参与得情况下对数据进行搬移操作,这样可以让cpu专心做数据计算
1、EDMA得请求源
三个,EDMA Channel 64个通道,对应64个同步事件;
HPI,PCI,EMAC master port;
L2 Cache controller/QDMA;
2、EDMA 得请求过程
TR---->TC---->地址产生器;
3、优先级
在DM642中,EDMA可以设置4种优先级,在EDMA传输控制器里面有四个优先级队列对应着这4个优先级,Q0~Q3,优先级依次递减,队列最长放16个申请,每个申请源对应得长度可以配置.但是任何一个队列的满,将会导致整个EDMA的提交处于STALL状态。从EDMA的队列来看,任何时候,总是优先服务高优先级的队列中请求,但是另外一方面,每一个队列中的传输请求(TR)总是串行服务的,因此,如果想两个EDMA交错进行,必须保证它们位于不同的队列之中,或者采用ATCC来进行触发。
有HPI的EDMA传输请求(burst最长为8个WORD),有L2和QDMA的请求(QDMA是通过L1D的write buffer 提交的,因此,不小心控制,可能会导致整个CPU 处于STALL状态),还有就是EDMA控制器提交的:在复杂系统中,例如有AUDIO,VIDEO,HPI,video decoder,以及QDMA,因此,从理论上看,最好的设置是L2的提交为urgent,而audio 设置为high,HPI设置为medium(缺省),video decoder/QDMA设置为low,那么视频必须设置为high或者urgent ,否则视频显示将出现莫明的小块,甚至横条。这种原因有多方面:例如将代码放在片外,HPI的请求导致的EDMA传输请求。如果将VIDEO设置低于HIGH,将导致video得不到service,而出现underflow的问题。
4、挂起
当任何一个EDMA申请源得搬移请求对应得队列满得时候该申请源的所有请求都被挂起,直到那个导致挂起的请求进入队列;
5、系统的EDMA优先级分配
四个队列是并行工作的,所以要合理分配优先级提高吞吐率----优先级的合理分配;
尽量将大数据量的搬移分配为低优先级,数据量少而实时要求高的放高优先级;
将大数据量的搬移拆分成几个小数据量的搬移;
6、EDMA的使用
打开--配置--事件触发
1、EDMA得请求源
三个,EDMA Channel 64个通道,对应64个同步事件;
HPI,PCI,EMAC master port;
L2 Cache controller/QDMA;
2、EDMA 得请求过程
TR---->TC---->地址产生器;
3、优先级
在DM642中,EDMA可以设置4种优先级,在EDMA传输控制器里面有四个优先级队列对应着这4个优先级,Q0~Q3,优先级依次递减,队列最长放16个申请,每个申请源对应得长度可以配置.但是任何一个队列的满,将会导致整个EDMA的提交处于STALL状态。从EDMA的队列来看,任何时候,总是优先服务高优先级的队列中请求,但是另外一方面,每一个队列中的传输请求(TR)总是串行服务的,因此,如果想两个EDMA交错进行,必须保证它们位于不同的队列之中,或者采用ATCC来进行触发。
有HPI的EDMA传输请求(burst最长为8个WORD),有L2和QDMA的请求(QDMA是通过L1D的write buffer 提交的,因此,不小心控制,可能会导致整个CPU 处于STALL状态),还有就是EDMA控制器提交的:在复杂系统中,例如有AUDIO,VIDEO,HPI,video decoder,以及QDMA,因此,从理论上看,最好的设置是L2的提交为urgent,而audio 设置为high,HPI设置为medium(缺省),video decoder/QDMA设置为low,那么视频必须设置为high或者urgent ,否则视频显示将出现莫明的小块,甚至横条。这种原因有多方面:例如将代码放在片外,HPI的请求导致的EDMA传输请求。如果将VIDEO设置低于HIGH,将导致video得不到service,而出现underflow的问题。
4、挂起
当任何一个EDMA申请源得搬移请求对应得队列满得时候该申请源的所有请求都被挂起,直到那个导致挂起的请求进入队列;
5、系统的EDMA优先级分配
四个队列是并行工作的,所以要合理分配优先级提高吞吐率----优先级的合理分配;
尽量将大数据量的搬移分配为低优先级,数据量少而实时要求高的放高优先级;
将大数据量的搬移拆分成几个小数据量的搬移;
6、EDMA的使用
打开--配置--事件触发
订阅:
博文 (Atom)