硬汉嵌入式论坛

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

[μCOS-III] 使用最新版uCOS-III V3.08.00要特别注意自带开关中断函数控制的中断优先级范围

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107567
QQ
发表于 2020-12-9 15:31:25 | 显示全部楼层 |阅读模式
现象:
客户反馈使用此贴的例子做串口数据连续发送的时候,数据会异常。

基于V5,V6和V7的最新版uCOS-III V3.08.00程序模板,含MDK和IAR两个版本,支持uC/Probe(2020-03-19)
http://www.armbbs.cn/forum.php?mod=viewthread&tid=96918


原因:

上面的例子里面开关中断的操作修改为使用uCOS的API实现了,在bsp.h文件里面

特别注意,现在的新版uCOS-II和III的开关中断也开始采用BASEPRI寄存器设置
http://www.armbbs.cn/forum.php?mod=viewthread&tid=93572


这个BASEPRI寄存器有个特点就是可以仅关闭受uCOS控制的中断,不受控的不关闭。
  1. /* 使能在源文件中使用uCOS-III的函数, 这里的源文件主要是指BSP驱动文件 */
  2. #define  uCOS_EN      1

  3. #if uCOS_EN == 1   
  4.         #include "os.h"   

  5.         #define  ENABLE_INT()      CPU_CRITICAL_EXIT()     /* 使能全局中断 */
  6.         #define  DISABLE_INT()     CPU_CRITICAL_ENTER()    /* 禁止全局中断 */
  7. #else
  8.         /* 开关全局中断的宏 */
  9.         #define ENABLE_INT()        __set_PRIMASK(0)        /* 使能全局中断 */
  10.         #define DISABLE_INT()        __set_PRIMASK(1)        /* 禁止全局中断 */
  11. #endif
复制代码


解决办法:

注:为了更好使用uCOS的这个功能,请务必使用NVIC的优先级分组4.

设置串口中断在uCOS-III可以管理的范围内。uCOS的控制范围在文件cpu_cfg.h定义

3.png

然后用户设置串口中断优先级即可,我们这里设置到1-15均可,只要受uCOS控制就行。
6.png












回复

使用道具 举报

615

主题

3070

回帖

4935

积分

至尊会员

积分
4935
发表于 2020-12-9 19:28:59 | 显示全部楼层
受教了啊,多谢多谢
回复

使用道具 举报

16

主题

148

回帖

196

积分

初级会员

积分
196
发表于 2020-12-9 21:22:21 | 显示全部楼层
我是设置的优先级高于这个可控制的优先级,也就是不受os控制,然后串口处理的时候之关闭自己相应的中断,使用到现在没有啥问题,也是这个驱动,没有大改动什么
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107567
QQ
 楼主| 发表于 2020-12-9 21:40:46 | 显示全部楼层
dyhfaily 发表于 2020-12-9 21:22
我是设置的优先级高于这个可控制的优先级,也就是不受os控制,然后串口处理的时候之关闭自己相应的中断,使 ...

关闭自己的中断是最好的方式,后面打算驱动也采用这种的,关全局没有关闭自己好。
回复

使用道具 举报

74

主题

1224

回帖

1446

积分

至尊会员

积分
1446
发表于 2020-12-10 09:01:15 | 显示全部楼层
用过freertos就知道了这个特点
回复

使用道具 举报

20

主题

393

回帖

453

积分

高级会员

积分
453
发表于 2020-12-10 10:35:03 | 显示全部楼层
我一般用默认的4貌似也是可以的,0-3留给裸机中断使用
回复

使用道具 举报

6

主题

126

回帖

144

积分

初级会员

积分
144
发表于 2020-12-10 10:42:52 | 显示全部楼层
mark,谢谢硬汉大哥分享OS_中断优先级问题
回复

使用道具 举报

6

主题

216

回帖

234

积分

高级会员

积分
234
发表于 2020-12-10 13:34:40 | 显示全部楼层
请教下,串口中断是不需要内核参与管理的呀,UCOSIII 默认#define  CPU_CFG_KA_IPL_BOUNDARY    4u,那么设置为        /* 配置NVIC the NVIC for UART */   HAL_NVIC_SetPriority(USART3_IRQn, 0, 3); 是不受内核管理的,没有问题呀?为啥这个中断非要受到内核管理呢?是因为该中断调用有OSSemPost(), OSTaskSemPost(), OSFlagPost(), OSQPost() or OSTaskQPost()等发布消息、信号、事件标志吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107567
QQ
 楼主| 发表于 2020-12-10 14:16:46 | 显示全部楼层
芯跳不止 发表于 2020-12-10 13:34
请教下,串口中断是不需要内核参与管理的呀,UCOSIII 默认#define  CPU_CFG_KA_IPL_BOUNDARY    4u,那么设 ...

因为这个串口驱动里面和串口中断服务程序里面都有调用到一个变量,然后对此变量在串口中断服务程序之外使用做了开关中断操作。这个开发中断的时候是采用的uCOS的API。
回复

使用道具 举报

2

主题

17

回帖

23

积分

新手上路

积分
23
发表于 2020-12-11 20:20:57 | 显示全部楼层
硬汉哥,你这个帖子太及时了,最近用你这个模板做项目,也是以太网通信一段时间出现问题了,或者莫名其妙的死机了,困扰了我好多天,按这个设置问题已解。
回复

使用道具 举报

2

主题

17

回帖

23

积分

新手上路

积分
23
发表于 2020-12-11 20:28:05 | 显示全部楼层
硬汉哥,你这个帖子太及时了,最近用你这个模板做项目,以太网通信一段时间出现异常,或其他者莫名其妙的问题,按照你这个设置问题已解,谢谢硬汉哥
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107567
QQ
 楼主| 发表于 2020-12-12 01:39:24 | 显示全部楼层
putin 发表于 2020-12-11 20:28
硬汉哥,你这个帖子太及时了,最近用你这个模板做项目,以太网通信一段时间出现异常,或其他者莫名其妙的问 ...

系统升级后,有时候防不胜防。
回复

使用道具 举报

4

主题

153

回帖

165

积分

初级会员

积分
165
发表于 2023-10-8 15:15:54 | 显示全部楼层
最新的ucos也遇到中断问题,新版的中断里调用进入临界-关中断等OSAPI操作,假设CPU_CFG_INT_DIS_MEAS_OVRHD_NBR=4,NVIC的优先级分组4,那么进入中断操作这些API,是不是会关闭4-15的中断,0-3的还是不会关闭
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107567
QQ
 楼主| 发表于 2023-10-8 15:28:36 | 显示全部楼层
浴火重生 发表于 2023-10-8 15:15
最新的ucos也遇到中断问题,新版的中断里调用进入临界-关中断等OSAPI操作,假设CPU_CFG_INT_DIS_MEAS_OVRHD ...

CPU_CFG_KA_IPL_BOUNDARY = 4时
0 -3 里面不受控
4-15里面受控
回复

使用道具 举报

4

主题

153

回帖

165

积分

初级会员

积分
165
发表于 2023-10-8 15:41:49 | 显示全部楼层
eric2013 发表于 2023-10-8 15:28
CPU_CFG_KA_IPL_BOUNDARY = 4时
0 -3 里面不受控
4-15里面受控

那么假设串口优先级为8,中断进入临界时,此时是关闭的中断仅是8还是4-15都关闭了
回复

使用道具 举报

5

主题

535

回帖

550

积分

金牌会员

积分
550
发表于 6 天前 | 显示全部楼层
芯跳不止 发表于 2020-12-10 13:34
请教下,串口中断是不需要内核参与管理的呀,UCOSIII 默认#define  CPU_CFG_KA_IPL_BOUNDARY    4u,那么设 ...

HAL_NVIC_SetPriority(USART3_IRQn, 0, 3)....这个设置是不是错误的?应该是HAL_NVIC_SetPriority(USART3_IRQn, 3, 0)
回复

使用道具 举报

5

主题

535

回帖

550

积分

金牌会员

积分
550
发表于 6 天前 | 显示全部楼层
eric2013 发表于 2020-12-10 14:16
因为这个串口驱动里面和串口中断服务程序里面都有调用到一个变量,然后对此变量在串口中断服务程序之外使 ...

请教一下,是不是0-3优先级中断里面也可以用CPU_CRITICAL_ENTER();

    CPU_CRITICAL_EXIT();,,,但是不起作用?
回复

使用道具 举报

20

主题

393

回帖

453

积分

高级会员

积分
453
发表于 6 天前 | 显示全部楼层
hqgboy 发表于 2024-5-31 16:25
请教一下,是不是0-3优先级中断里面也可以用CPU_CRITICAL_ENTER();

    CPU_CRITICAL_EXIT();,,,但 ...

0-3优先级中断里面,不能用OS相关的函数和变量,跟裸机一样就行
回复

使用道具 举报

5

主题

535

回帖

550

积分

金牌会员

积分
550
发表于 6 天前 | 显示全部楼层
h_007 发表于 2024-5-31 16:56
0-3优先级中断里面,不能用OS相关的函数和变量,跟裸机一样就行

好的。4-15优先级中断,还使用CPU_CRITICAL_ENTER(); CPU_CRITICAL_EXIT()吧?
回复

使用道具 举报

5

主题

535

回帖

550

积分

金牌会员

积分
550
发表于 6 天前 | 显示全部楼层
h_007 发表于 2024-5-31 16:56
0-3优先级中断里面,不能用OS相关的函数和变量,跟裸机一样就行

谢谢回复。
回复

使用道具 举报

20

主题

393

回帖

453

积分

高级会员

积分
453
发表于 6 天前 | 显示全部楼层
hqgboy 发表于 2024-5-31 17:01
好的。4-15优先级中断,还使用CPU_CRITICAL_ENTER(); CPU_CRITICAL_EXIT()吧?

一般来说,4和15不要用(专门给OS用的),用户中断在5~14,进去和退出加CPU_CRITICAL_ENTER(); CPU_CRITICAL_EXIT();
回复

使用道具 举报

5

主题

535

回帖

550

积分

金牌会员

积分
550
发表于 5 天前 | 显示全部楼层
h_007 发表于 2024-5-31 17:20
一般来说,4和15不要用(专门给OS用的),用户中断在5~14,进去和退出加CPU_CRITICAL_ENTER(); CPU_CRITI ...

好的。谢谢。
回复

使用道具 举报

5

主题

535

回帖

550

积分

金牌会员

积分
550
发表于 5 天前 | 显示全部楼层
h_007 发表于 2024-5-31 17:20
一般来说,4和15不要用(专门给OS用的),用户中断在5~14,进去和退出加CPU_CRITICAL_ENTER(); CPU_CRITI ...

再请教一下:5~14中断,下面命令还需要吧?   CPU_CRITICAL_ENTER();
    OSIntNestingCtr++;                                      /* Tell uC/OS-III that we are starting an ISR             */
    CPU_CRITICAL_EXIT();
回复

使用道具 举报

20

主题

393

回帖

453

积分

高级会员

积分
453
发表于 5 天前 | 显示全部楼层
hqgboy 发表于 2024-6-1 14:03
再请教一下:5~14中断,下面命令还需要吧?   CPU_CRITICAL_ENTER();
    OSIntNestingCtr++;           ...

规范中断写法:
/**
  * @brief This function handles USART1 global interrupt.
  */
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
        CPU_SR_ALLOC();

        CPU_CRITICAL_ENTER();
        OSIntEnter();
        CPU_CRITICAL_EXIT();
  /* USER CODE END USART1_IRQn 0 */

  HAL_UART_IRQHandler(&huart1);

  /* USER CODE BEGIN USART1_IRQn 1 */
        OSIntExit();
  /* USER CODE END USART1_IRQn 1 */
}
回复

使用道具 举报

5

主题

535

回帖

550

积分

金牌会员

积分
550
发表于 5 天前 | 显示全部楼层
h_007 发表于 2024-6-1 14:18
规范中断写法:
/**
  * @brief This function handles USART1 global interrupt.

好的。谢谢。
我还用的是标准库
回复

使用道具 举报

20

主题

393

回帖

453

积分

高级会员

积分
453
发表于 5 天前 | 显示全部楼层
都一样,都是Handler
回复

使用道具 举报

5

主题

535

回帖

550

积分

金牌会员

积分
550
发表于 5 天前 | 显示全部楼层
h_007 发表于 2024-5-31 17:20
一般来说,4和15不要用(专门给OS用的),用户中断在5~14,进去和退出加CPU_CRITICAL_ENTER(); CPU_CRITI ...

UCOSIII3.08操作系统,开始控制硬件中断了。从3.07移植过来,还需要熟悉一下了。、谢谢。
回复

使用道具 举报

20

主题

393

回帖

453

积分

高级会员

积分
453
发表于 5 天前 | 显示全部楼层
ucosIII要最新的话,在CubeMX里面有,在第三方库选项里,可以直接下的
Cesium v3.08.3
回复

使用道具 举报

5

主题

535

回帖

550

积分

金牌会员

积分
550
发表于 3 天前 | 显示全部楼层
喔。我刚移植完3.08.02,还有些问题没解决了。
又出来3.08.03,这速度跟不上。
回复

使用道具 举报

5

主题

535

回帖

550

积分

金牌会员

积分
550
发表于 3 天前 | 显示全部楼层
专门看了原子的3.08.01。
1,中断NVIC的优先级分组2,不是4.
2,硬件中断也没专门处理。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-6 05:52 , Processed in 0.404708 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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