OMAP-L138 的新历程之实时控制单元PRUSS(7) PRUSS 的全称为: Programmable Real-Time Unit Subsystem。omap-l138 芯片上集成了两个pruss 实时可编程的处理内核,这两个内核可以当成一般的单片机使用(个人的理解)。这两个内核可以做一些基础的加减逻辑运算等!PRUSS 内部包含了一个 32bit 的RISC 内核,一个中断控制器(不能象单片机一样用中断向量表和中断处理,只能用查询实现),自己的内部指令和数据存储内存,外部接口可以抓捕外部引脚状态。 关于 omap 的PRUSS 单元网上的资料不是很多,可以参考 TI 网站上的模块介绍。PRUSS 的模块框图如图所示: 每个核有32 个输出引脚GPOs,30 个输入引脚GPIs。在内核中用两个个特殊功能寄存器作控制, R30控制32 个输出引脚的输出电平值,R31 反应 30 输入引脚的输入状态值,高两位来自于中断模块INTC 的状态。PRUSS 指令内存有 4KB,然而数据内存只有 512 字节。由于编程主要使用汇编实现的,所以基本上不用堆栈等。 内存映射如图: 可以看到每个内核的内存有自己的地址也用在omap 中的全局地址,这样就更加方便的访问我们的单元了。我们通过DSP 或者 ARM 加载我们PRUSS 内核程序时只能加载到omap 映射的空间,然后释放内核让其执行内核程序!内核功能模块如图所示: 在这儿我特别指出一点就是这儿有一个常量表,这个表是一般单片机所没有的,这个是该芯片设计时为了减少内存的大小和为了加快指令的执行速度。通过一些特殊的寄存器来操作这个常量表,例如:我们想用一些常用的外设,只要把他的基地址找到之后通过偏移就可以得到某些寄存器的值。这样我就在很小的范围变化我们的地址空间就可以了。 当我们要使用这些外设的时候我建议大家直接使用这个常量表来查找相应的寄存器。这样可以很方便的访问我们的外设寄存器。指令一般是:LBCO REG1, Cn2, OP(255), IM(124)或者 SBCO REG1, Cn2, OP(255), IM(124) 至于 PRUSS 中断部分我想在后一篇文章中专门介绍一下,我在这儿做了一个小实验,就是用DSP 使能PRUSS1 ,然后加载 PRUSS 的程序到 PRUSS 的内存段,然后使能让其自动运行。由于测试方便在此我把DSP 中的两个全局变量的地址编译进了PRUSS 程序的汇编代码中,让其把我们手动输入的a[0]地址的值赋值给 a[1]地址,以此来检验PRUSS 是否已经工作!即:a[1]=a[0] CORE_LOOP: MOV32 r11, 0x80003F30 ; 将 a[0]地址给r11 LBB...