|
发表于 2021-10-3 14:51:55
|
显示全部楼层
原子哥,你好,之前在将你写的以太网高效模板移植到ucos2(V2.93.00)中,遇到在ETH_IRQHandler中post后如果再调用OSIntExit函数,运行一段时间后就会hardfault,临时处理不调用OSIntExit,这样是不是不能中断后及时进行任务调用,其他影响应该不大吧
- void ETH_IRQHandler (void) {
- OS_FRAME *frame;
-
- U32 i, RxLen;
- U32 *sp,*dp;
- #if __RTX == 1
- // uint8_t err;
- // OS_INIT_CRITICAL();
- // OS_ENTER_CRITICAL();
- // OSIntEnter();
- // OS_EXIT_CRITICAL();
- #endif
-
-
- i = RxBufIndex;
- do {
- if (Rx_Desc[i].Stat & DMA_RX_ERROR_MASK) {
- goto rel;
- }
- if ((Rx_Desc[i].Stat & DMA_RX_SEG_MASK) != DMA_RX_SEG_MASK) {
- goto rel;
- }
- RxLen = ((Rx_Desc[i].Stat >> 16) & 0x3FFF) - 4;
- if (RxLen > ETH_MTU) {
- /* Packet too big, ignore it and free buffer. */
- goto rel;
- }
- /* Flag 0x80000000 to skip sys_error() call when out of memory. */
- frame = alloc_mem (RxLen | 0x80000000);
- /* if 'alloc_mem()' has failed, ignore this packet. */
- if (frame != NULL) {
- sp = (U32 *)(Rx_Desc[i].Addr & ~3);
- dp = (U32 *)&frame->data[0];
- for (RxLen = (RxLen + 3) >> 2; RxLen; RxLen--) {
- *dp++ = *sp++;
- }
- put_in_queue (frame);
- }
- /* Release this frame from ETH IO buffer. */
- rel:Rx_Desc[i].Stat = DMA_RX_OWN;
- if (++i == NUM_RX_BUF) i = 0;
- }
- while (!(Rx_Desc[i].Stat & DMA_RX_OWN));
- RxBufIndex = i;
- if (ETH->DMASR & INT_RBUIE) {
- /* Receive buffer unavailable, resume DMA */
- ETH->DMASR = ETH_DMASR_RBUS;
- ETH->DMARPDR = 0;
- }
- /* Clear pending interrupt bits */
- ETH->DMASR = ETH_DMASR_NIS | ETH_DMASR_AIS | ETH_DMASR_RS;
- #ifdef __RTX
- //OSFlagPost (FLAG_TCPnet, 0x0001, OS_FLAG_SET, &err);
- OSSemPost(pevent_current_DET);
- test_eth_flag[7]++;
- // OSIntExit();
- #endif
- }
复制代码 |
|