gpt4 book ai didi

c - 处理中断的正确方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 01:28:34 26 4
gpt4 key购买 nike

我正在从事一个需要 USB 通信的项目。我使用的是运行 ARM cortex M0 内核的 Nuvoton NUC123,速度为 48MHz、20kb RAM 和 64kb 闪存。每当 USB 端点从主机获取数据传输给它时,无论是 Ack、Nak 还是设置数据包,微 Controller 都会执行硬件中断。制造商提供的示例代码相当脏,它涉及到中断所属的端点的 switch-case-ing,如果它是包含类特定请求的设置数据包,它会为每个接口(interface)或端点创建一个 switch-case这可能是请求的目标。

我想我可以通过定义一个结构数组来使事情变得更漂亮:

typedef void UsbEventCallback(uint32_t u32IntFlag, uint32_t u32EPSTS);
typedef uint32_t UsbClassReqCallback(void);

typedef struct
{
uint8_t ep_address;
uint32_t config;
uint32_t buff_offset;
UsbClassReqCallback *usb_classreq_cb;
UsbEventCallback *usb_event_cb;
} ATTR_PACKED EP_Config_Struct;

typedef struct
{
uint8_t interface_id;
UsbClassReqCallback *usb_classreq_cb;
} ATTR_PACKED Interface_Config_Struct;

extern const EP_Config_Struct EP_config_settings[TOTAL_NUM_ENDPOINTS];
extern const Interface_Config_Struct interfaces_config_settings[TOTAL_NUM_INTERFACES];

然后,在中断回调中我做了:

switch(  req_destination )
{
case 1: //interface
for ( uint8_t interface_index = 0 ; interface_index < TOTAL_NUM_INTERFACES ; interface_index++ )
{
if ( interfaces_config_settings[interface_index].interface_id == UsbDev.Setup.wIndex )
{
if ( interfaces_config_settings[interface_index].usb_classreq_cb == NULL )
return FALSE;
else
return (*interfaces_config_settings[interface_index].usb_classreq_cb)();
}
}
break;
case 2: //endpoint
for ( uint8_t ep_index = 0 ; ep_index < TOTAL_NUM_ENDPOINTS ; ep_index++ )
{
if ( EP_config_settings[ep_index].ep_address == UsbDev.Setup.wIndex )
{
if ( EP_config_settings[ep_index].usb_classreq_cb == NULL )
return FALSE;
else
return (*EP_config_settings[ep_index].usb_classreq_cb)();
}
}
break;
}
return FALSE;

我的问题是:在中断时间内不实际做出所有这些决定并调用所有这些其他函数是否更好?我是否最好只保存中断数据并切换一些标志以要求主线程处理中断?尽快从回调中返回有多重要?

您认为这种程序的正确架构是什么?

谢谢

最佳答案

在不确切了解您的应用程序的情况下很难说,但您的中断处理程序看起来很合理。

通常对于多任务系统,建议在中断处理程序中做尽可能少的事情,因为在处理中断时系统上的不同任务不再被调度。这可能比那复杂得多,尤其是在使用中断优先级和中断嵌套时,但总体思路仍然是避免在中断处理程序中停留太久。

对于您的 USB 驱动程序,我会在中断处理程序中选择适当的端点/接口(interface),然后将接收到的数据写入适当的队列/数组中,最后触发标志/信号量以表示已接收到一些数据。然后我会解析在正常任务中接收到的数据,而不是直接在中断处理程序中,以保持中断处理程序最少。

关于c - 处理中断的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27178726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com