05-SA8155 QNX Hypervisor BSP之Interrupts中断_sa8155 gpio 对应 irq

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

extern int InterruptUnmask(int __intr, int __id);
extern void InterruptLock(struct intrspin * __spin);
extern void InterruptUnlock(struct intrspin * __spin);
extern unsigned InterruptStatus(void);


 常用配置接口:



extern int ThreadCtl(int __cmd, void *__data);
extern int InterruptAttachEvent(int __intr, const struct sigevent *__event, unsigned __flags);
extern int InterruptWait_r(int __flags, const _Uint64t *__timeout);
extern int InterruptUnmask(int __intr, int __id);
extern int InterruptDetach(int __id);


## 3. 步骤


### 3.1 I/O权限



//get I/O privileges
if (-1 == ThreadCtl(_NTO_TCTL_IO, 0)) {
printf(“Failed to get IO privileges!”);
goto exit_err;
}


###  3.2 中断IO配置



> 
> int32\_t gpio\_set\_interrupt\_cfg(int fd, uint32\_t gpio, uint32\_t trigger, void \*event)
> 
> 
> 



// Set up edge detection of pin
if(GPIO_FAIL == gpio_set_interrupt_cfg(fd,gpio_number,trigger,NULL))
{
printf(“Failed to setup detect pin interrupt \n”);
goto exit_err;
}

if(GPIO_FAIL == (status = gpio_get_interrupt_cfg(fd,gpio_number,&irq)))
{
printf(“Failed to get irq corresponding to gpio %d \n”,gpio_number);
goto exit_err;
}
else
{
if (irq == -1)
{
printf(" irq corresponding to gpio %d is %d status %d - exiting\n",gpio_number,irq, status);
goto exit_err;
}
printf(" irq corresponding to gpio %d is %d status %d\n",gpio_number,irq, status);
}


####  3.3 中断实现



// Attach Event ISR
SIGEV_INTR_INIT(&int_event);
interrupt_id = InterruptAttachEvent(irq, &int_event, _NTO_INTR_FLAGS_TRK_MSK);

printf(“Wakeup setup successfully completed and now wait for interrupt \n”);

while ( 1 ) {
// Wait for interrupt
status = InterruptWait_r(0, NULL );
if (status != EOK)
{
printf(“InterruptWait_r failed with error %d \n”,status);
break;
}

printf("Got GPIO%d interrupt\n", gpio_number );
InterruptUnmask(irq, interrupt_id);

}

InterruptDetach(interrupt_id);


### 3.4 通知实现


#### 3.4.1 通知方法



> 
> * SIGEV\_INTR/InterruptWait()
> 	+ 最简单也最快速
> 	+ 必须在一个线程里
> 	+ 队列里元素只有有1个
> * Pulse
> 	+ 可以在多线程下等待接收channel上的消息
> 	+ 可以队列化
> 	+ 最灵活
> * Signal
> 	+ 如果使用signal handler,那将是开销最大的方案
> 	+ 可以队列化
> 
> 
> 


#### 3.4.2 Pulse案例


* InterruptAttach 操作实现handler: //伪代码如下



#define INTR_PULSE _PULSE_CODE_MINAVAIL
struct sigevent event;

const struct sigevent* handler(void *area,int id){
// do work
return (&event); // wake up main thread
}

int main(){
chid = ChannelCreate(0);
coid = ConnectAttach(ND_LOCAL_NODE,0,chid,_NTO_SIDE_CHANNEL,0);
SIGEV_PULSE_INIT(&event,coid,MyPriority,INTR_PULSE,0);
InterruptAttach(intnum, handler,NULL,0,_NTO_INTR_FLAGS_TRK_MSK);
for(;😉{
rcvid = MsgReceive(chid,…);
if(rcvid == 0){
// got a pulse
}
}
return 0;
}


* **使用ionotify :** //伪代码如下



if (-1 != (fd = open(“/dev/gpio/tlmm/38”, O_RDWR))) {
chid = ChannelCreate( 0 );
coid = ConnectAttach( 0, 0, chid, _NTO_SIDE_CHANNEL, 0 );
SIGEV_PULSE_INIT(&event, coid, SIGEV_PULSE_PRIO_INHERIT,
QCGPIO_TEST_CODE, 0);
LOG(“qcgpio_test : calling ionotify\n”);
rtn = ionotify(fd, _NOTIFY_ACTION_POLLARM, _NOTIFY_COND_INPUT, &event);
rcvid = MsgReceive(chid, &msg, sizeof(msg), NULL);
if (rcvid != 0) {
LOG(“qcgpio_test : invalid pulse received\n”);
} else {
LOG(“qcgpio_test : Hurray…! pulse received.\n”);
}
}


## 4. 实操


测试demo:qnx\_ap/AMSS\platform\services\applications\tlmm\_gpio\_interrupt\_test.c





**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/c7c73edf72bbaca9d66f7c34f113ed3f.png)
![img](https://img-blog.csdnimg.cn/img_convert/9dc57c80cf1cd4485151e294ee1c1f8e.png)

**[如果你需要这些资料,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618679757)**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**

**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

戳这里获取](https://bbs.youkuaiyun.com/topics/618679757)**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**

**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值