硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1900|回复: 5
收起左侧

...UCOSV2.92.11 OS_Sched 后有概率进入hardfault...

[复制链接]

27

主题

91

回帖

172

积分

初级会员

积分
172
发表于 2021-9-23 10:44:41 | 显示全部楼层 |阅读模式
....发现个问题,工程运行一阵,出现hardfault,进过分析,在OSQPEND调用OS_Sched时,有概率进入hardfault,请问有什么解决办法没...
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2021-9-23 11:02:26 | 显示全部楼层
仅楼主描述的这些信息,不好找问题。
只能逐个任务排查
回复

使用道具 举报

8

主题

27

回帖

51

积分

初级会员

积分
51
发表于 2021-10-3 14:47:50 | 显示全部楼层
之前在将RL-tcpnet从原子哥ucos3移到ucos2(V2.93.00)时,在ETH_IRQHandler中断中post信号量后如果再调用OSIntExit(),系统跑一段时间后就会hardfault,临时方案不调用OSIntExit(),楼主找到原因没
回复

使用道具 举报

8

主题

27

回帖

51

积分

初级会员

积分
51
发表于 2021-10-3 14:51:55 | 显示全部楼层
eric2013 发表于 2021-9-23 11:02
仅楼主描述的这些信息,不好找问题。
只能逐个任务排查

原子哥,你好,之前在将你写的以太网高效模板移植到ucos2(V2.93.00)中,遇到在ETH_IRQHandler中post后如果再调用OSIntExit函数,运行一段时间后就会hardfault,临时处理不调用OSIntExit,这样是不是不能中断后及时进行任务调用,其他影响应该不大吧
  1. void ETH_IRQHandler (void) {
  2.   OS_FRAME *frame;
  3.   
  4.         U32 i, RxLen;
  5.   U32 *sp,*dp;
  6. #if __RTX == 1
  7. //        uint8_t err;
  8. //        OS_INIT_CRITICAL();

  9. //        OS_ENTER_CRITICAL();
  10. //        OSIntEnter();                        
  11. //        OS_EXIT_CRITICAL();
  12. #endif
  13.        
  14.        
  15.   i = RxBufIndex;
  16.   do {
  17.     if (Rx_Desc[i].Stat & DMA_RX_ERROR_MASK) {
  18.       goto rel;
  19.     }
  20.     if ((Rx_Desc[i].Stat & DMA_RX_SEG_MASK) != DMA_RX_SEG_MASK) {
  21.       goto rel;
  22.     }
  23.     RxLen = ((Rx_Desc[i].Stat >> 16) & 0x3FFF) - 4;
  24.     if (RxLen > ETH_MTU) {
  25.       /* Packet too big, ignore it and free buffer. */
  26.       goto rel;
  27.     }
  28.     /* Flag 0x80000000 to skip sys_error() call when out of memory. */
  29.     frame = alloc_mem (RxLen | 0x80000000);
  30.     /* if 'alloc_mem()' has failed, ignore this packet. */
  31.     if (frame != NULL) {
  32.       sp = (U32 *)(Rx_Desc[i].Addr & ~3);
  33.       dp = (U32 *)&frame->data[0];
  34.       for (RxLen = (RxLen + 3) >> 2; RxLen; RxLen--) {
  35.         *dp++ = *sp++;
  36.       }
  37.       put_in_queue (frame);
  38.     }
  39.     /* Release this frame from ETH IO buffer. */
  40. rel:Rx_Desc[i].Stat = DMA_RX_OWN;

  41.     if (++i == NUM_RX_BUF) i = 0;
  42.   }
  43.   while (!(Rx_Desc[i].Stat & DMA_RX_OWN));
  44.   RxBufIndex = i;

  45.   if (ETH->DMASR & INT_RBUIE) {
  46.     /* Receive buffer unavailable, resume DMA */
  47.     ETH->DMASR = ETH_DMASR_RBUS;
  48.     ETH->DMARPDR = 0;
  49.   }
  50.   /* Clear pending interrupt bits */
  51.   ETH->DMASR = ETH_DMASR_NIS | ETH_DMASR_AIS | ETH_DMASR_RS;
  52. #ifdef __RTX
  53.         //OSFlagPost (FLAG_TCPnet, 0x0001, OS_FLAG_SET, &err);
  54.   OSSemPost(pevent_current_DET);
  55.         test_eth_flag[7]++;
  56. //        OSIntExit();
  57. #endif
  58. }
复制代码
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2021-10-4 13:56:23 | 显示全部楼层
xsyyhz 发表于 2021-10-3 14:51
原子哥,你好,之前在将你写的以太网高效模板移植到ucos2(V2.93.00)中,遇到在ETH_IRQHandler中post后 ...

有个专门的接口文件也要重写。
回复

使用道具 举报

27

主题

91

回帖

172

积分

初级会员

积分
172
 楼主| 发表于 2021-10-5 15:02:25 | 显示全部楼层
xsyyhz 发表于 2021-10-3 14:47
之前在将RL-tcpnet从原子哥ucos3移到ucos2(V2.93.00)时,在ETH_IRQHandler中断中post信号量后如果再调用O ...

。。。。临时方法:不用多POST 单PEND
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 00:56 , Processed in 0.039857 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表