请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:PROCESSOR-SDK-AM335X 工具/软件:TI C/C++编译器
您好!
我在 BeagleBone Black 上使用 Linux 的 AM335x Sitara 处理器的 PRU、我对 PRU 本身有一些疑问。
我将在下面继续我的问题:PRU 是否可以用作独立微控制器?
为了更好地解释我的意思、我将展示执行以下任务的以下示例:
- 1 -切换 P9_27 GPIO
- 1 -读取 P9_28 GPIO
- 3 -如果 P9_28处于逻辑状态0、则向 Linux 程序发送中断事件。
PRU 汇编代码如下:
//在 PRU 存储器 中启动程序.origin 0 //程序入口点(对于调试器) .entrypoint 开始 //每条指令5ns #define INS_PER_us 200 //每个延迟循环两条指令 #define INS_PER_DELAY_LOOP 2 #define DELAY 1 *(INS_PER_us / INS_PER_DELAY_LOOP) //允许通知程序完成 #define PRU0_R31_VEC_VALID 32 //发回 的事件编号#define PRU_EVTOUT_0 3 #define GER 0x00020010 #define SECR0 0x00020280 #define SECR1 0x00020284 start: //打开输出引脚(LED 打开) 设置 r30.T5 //将延迟长度存储在 reg0中 MOV r0、延迟 delayon: //将 reg0减1 subr0、r0、1 //循环到 delayon,除非 reg0=0 qbne delayon、r0、0 LEDOFF: //清除出纸槽(LED 关闭) CLR r30.T5 //将 reg0重置为延迟的长度 MOV r0、延迟 取消: //将 reg0减1 subr0、r0、1 //循环到 delayoff,除非 reg0=0 qbne delayoff、r0、0 //是否按下了按钮? 如果没有、则循环 qbbc start、r31.T3 exec_int: //通知已完成的呼叫应用程序 MOV R31.b0、PRU0_R31_VEC_VALID | PRU_EVTOUT_0 JMP 启动
使用 prussdrv 库的 C 程序是:
/**编程加载 PRU 程序,使 LED 闪烁,直到 *按下按钮。 作者:Derek Molloy、阅读《探索 BeagleBone *》一书、该书基于以下网址的示例代码: * processors.wiki.ti.com/.../PRU_Linux_Application_Loader_API_Guide */ #include #include #include #include #include #include #define PRU_NUM0 //在这些示例 中使用 PRU0 typedef 枚举 { false、true }bool; int main (void) { int n = 0; int res = 0; if (getuid()!=0) { printf("You must run this program as root. 正在退出。\n"); EXIT (EXIT_FAILURE); } //初始化 prussdrv_pruintc_intc 使用的结构 //可在 pruss_intc_mapping.h 中找到 PRUSS_INTC_INITDATA tpruss_intc_initdata pruss_intc_initdata = PRUSS_INTC_INITDATA; //分配和初始化内存 RES = prussdrv_init (); printf ("prussdrv_init =%d\n"、res); RES = prussdrv_open (PRU_EVTOUT_0); printf ("prussdrv_open =%d\n"、res); //映射 PRU 的中断 prussdrv_pru_reset (0);
RES = prussdrv_pruintc_init (&pruss_intc_initdata); printf ("prussdrv_pruintc_init =%d\n"、res);
//在 PRU 上加载并执行 PRU 程序 prussdrv_exec_program (PRU_NUM、"./ledButton.bin"); while (真) { //等待 PRU 的事件完成,返回 PRU_EVTOUT_0编号 N = prussdrv_PRU_WAIT_EVENT (PRU_EVTOUT_0); printf ("ebb PRU 程序已完成、事件编号%d.\n"、n); // prussdrv_exec_program (PRU_NUM、"../ledButton。bin"); } //禁用 PRU 并关闭存储器映射 prussdrv_PRU_disable (PRU_NUM); prussdrv_exit (); 返回 EXIT_SUCCESS ;}
程序本身正常工作、GPIO 切换、中断从 PRU 发送并从 Linux 程序捕获、但:
- 2 - PRU 正在对 P9_28 GPIO 执行轮询。
- 2 - 在 PRU 向 Linux 发送一个中断事件后、我无法再次发送该中断事件。 如果要重新发送中断事件、我必须将固件重新加载到 PRU。
最后的问题是:
- 3-是否可以在向 Linux 发送通知之前从 PRU 生成硬件中断(如 GPIO 状态更改)? 换句话说、让 PRU 进入无限循环、并在生成硬件中断时跳转到中断矢量。
- 3-是否可以在无需重新加载 PRU 固件的情况下将中断事件重新发送到 Linux?
您能否确认任务1.3和2.3是否可行?
如果可能的话、我当然会在 AM335x Techincal 参考手册中遗漏一些信息。 在这种情况下,您能否给我指正确的部分或给我一些建议?
谢谢你。
此致、
Simon