in_interrupt的含义

本文深入探讨了in_interrupt()函数的作用,它用于判断当前进程是否处于中断上下文,包括底半部和硬件中断处理过程。通过内联代码分析,解释了如何通过中断计数和底半部计数来确定中断状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

in_interrupt()是判断当前进程是否处于中断上下文,这个中断上下文包括底半部和硬件中断处理过程,

函数实现:

     #define in_interrupt() ({ const int __cpu = smp_processor_id(); \
          (local_irq_count(__cpu) + local_bh_count(__cpu) != 0); })

判断中断计数和底半部计数是否〉0,如果只希望判断是否在硬件中断上下文,则可以使用:in_irq()。

/******************************************************************************* * Function Name : USB_Init * Description : USB初始化 * Input : None * * Output : None * Return : None ******************************************************************************/ void USB_Init(void) { //CCM->PHYPA = 0x10;//usbphy clk sel 60M USB_POWER_ON; USB_SoftReset(); //释放USB_PHY CPM->CPM_SRSTCR1 &= ~(1 << USBPHY_RST_RELEASE_BIT); USBPHY_CLK_SEL_60M; g_RevOffset = 0; g_transLens = 0; g_Ep0Data_Stage = 0; g_usbVer = 0;//USB1.1 /* Global USB Register */ gUSBC_fifoReg = (USBC_FIFOTypeDef*)(USBC_BASE_ADDR+0x60); gUSBC_ComReg = (USBC_CommonTypeDef*)USBC_BASE_ADDR; gUSBC_IdxReg = (USBC_IndexedTypeDef*)(USBC_BASE_ADDR+0x10); //The suspend mode is disable before BULK-Only tranfer start g_suspendMode = 0; /* Setup USB register */ //enable usb common interrupt //0 1 2 3 4 5 6 7 (bit) //Susp Resume Reset SOF Conn Discon SessReq VBusErr gUSBC_ComReg->INTRUSBE = USB_INTERRUPT_RESET |USB_INTERRUPT_CONNECT |USB_INTERRUPT_DISCON |USB_INTERRUPT_SUSPEND |USB_INTERRUPT_RESUME; //|USB_INTERRUPT_SOF; //enable ep0 and ep1 tx interrupts,clear other tx interrupts gUSBC_ComReg->INTRTXE_L = USB_INTERRUPT_EP0|(1<<USB_ENDPOINT_INDEX); //enable ep1 rx interrupt,clear other rx interrupts gUSBC_ComReg->INTRRXE_L = (1<<USB_ENDPOINT_INDEX); g_usb_data_in_ep = USB_ENDPOINT_INDEX; g_usb_data_out_ep = USB_ENDPOINT_INDEX;//send //ensure ep0 control/status regesters appeare in the memory map. gUSBC_ComReg->EINDEX = CONTROL_EP; SetFIFO_Addr(USBEPX_TABLE[0],3); //Enable Soft connection if(g_usbVer == 1) gUSBC_ComReg->UCSR = USB_POWER_SOFT_CONN|USB_POWER_HS_ENAB; else { gUSBC_ComReg->UCSR = USB_POWER_SOFT_CONN; } interrupt_setup(USB_INT_NUM, 0x00); }解析,如果需要提供相关手册资料,请提出
03-08
void NRF24L01_RX_MODE() { NRF24L01_Check(); nrf_gpio_pin_write(MY_24L01_CE, 0);//拉低CE NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(uint8_t*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址 NRF_LOG_INFO("NRF_WRITE_REG+EN_AA"); NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答 NRF_LOG_INFO("NRF_WRITE_REG+EN_RXADDR"); NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址 NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,55); //设置RF通信频率 NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度 NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x26);//设置TX发射参数,0db增益(最大),250kbps速率,低噪声增益开启 250kbps RF_DR:设置数据速率,注意高位和低位,00=1Mbps、01=2Mbps、10=250kbps、11=保留 NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0F);//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 NRF_LOG_INFO("NRF_WRITE_REG+CONFIG"); nrf_gpio_pin_write(MY_24L01_CE, 1);//CE为高,进入接收模式 nrf_delay_us(130); NRF_LOG_FLUSH(); uint8_t rx_buf[RX_PLOAD_WIDTH]={0x06,0x02,0x03,0x04,}; } void NRF24L01_TX_MODE() { nrfx_gpiote_in_config_t key_interrupt_test2; NRF24L01_Check(); key_interrupt_test2.hi_accuracy=true; //true表示需要高精度场景(快速检测按钮的按下和释放) key_interrupt_test2.pull=NRF_GPIO_PIN_PULLUP; //引脚配置为下拉电阻 NRF_GPIO_PIN_PULLUP key_interrupt_test2.sense=GPIOTE_CONFIG_POLARITY_HiToLo; nrfx_gpiote_in_init(MY_NRF24L01_INT2,&key_interrupt_test2,key_test_interupt1); //gpiote初始化配置 nrf_drv_gpiote_in_event_enable(MY_NRF24L01_INT2, true); nrf_gpio_pin_write(MY_24L01_CE, 0);//拉低CE NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(uint8_t*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址 NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(uint8_t*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答 NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址 NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1F); //设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次 NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,55); //设置RF通道为40 NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x26); //设置TX发射参数,0db增益,250k bps,低噪声增益开启 250kbps RF_DR:设置数据速率,注意高位和低位,00=1Mbps、01=2Mbps、10
03-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值