通过定义一种结构体
typedef struct __pruss_irq_fn_map
{
//Interrupt handler
PRUSSDRV_IRQ_HANDLER irqHandler;
//Binary semaphore to wait on
Semaphore_Handle semHandle;
}pruss_irq_fn_map;
将中断处理函数和信号量相互整合在一起。
中断处理函数通过定义虚函数的方式
typedef void (*PRUSSDRV_IRQ_HANDLER)(void);
当HWI任务产生的时候,HWI内容就产生对应的信号量Semaphore_post调用响应的task任务。
在应用程序中,通过用函数PRUSSDRVPruwaitEvent() 来等待Hwi中断的产生
在HWI中断处理模式下,CMDACK的中断优先级比HWI的优先级要先,所以,ARM只能用轮询的方式查看PRU中断的产生
可以看出在普通的非轮询的方式的时候,ARM与PRU之间是通过ARM2PRU与PRU2ARM的中断方式来进行事件的同步的。
在pruss.c里面有一个函数说明之间的操作
/**
* \brief This function generates and INTC event, waits for AINTC event and
* clears an INTC event \n
*
* \param eventnum The INTC Event number.\n
*
* \return 0 in case of successful transition, -1 otherwise. \n
*/
int PRUSSDRVPruSendWaitCearEvent(unsigned int sendEventNum,
unsigned int pruEvtoutNum,
unsigned int ackEventNum)
{
PRUSSDRVPruSendEvent(sendEventNum);
PRUSSDRVPruWaitEvent(pruEvtoutNum);
PRUSSDRVPruClearEvent(ackEventNum);
return 0;
}
通过这个函数可以blocked 当前进行的任务,等待下一次中断的产生。
以下,问题,对于PDI和SYNC的任务可以通过这种方式来思考,对于LED_task和task1是采用什么方式进行调度的?
下面可以看看cmdask函数