硬汉嵌入式论坛

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

[μCOS-II] uCOS的临界区一般用在什么地方??

[复制链接]

20

主题

110

回帖

170

积分

初级会员

积分
170
发表于 2018-10-14 20:14:32 | 显示全部楼层 |阅读模式
这两天闲着就学了下uCOS,移植好了准备学开始创建任务。
有些例程里创建任务时会设置临界区:
void startTask(void *p_arg)
{
        OS_CPU_SR cpu_sr=0;
        p_arg = p_arg;
        OS_ENTER_CRITICAL();
        OSTaskCreate(led0Task, (void*)0, (OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE - 1], LED0_TASK_PRIO);
        OSTaskCreate(led1Task, (void*)0, (OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE - 1], LED1_TASK_PRIO);
        OSTaskSuspend(START_TASK_PRIO);
        OS_EXIT_CRITICAL();
}


---------------------
作者:远去的栀子花
来源:CSDN

OS_ENTER_CRITICAL();、OS_EXIT_CRITICAL();这两个该什么时候使用?例子里创建新任务加上临界区有什么好处?





回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
发表于 2018-10-14 21:14:53 | 显示全部楼层
临界区就是关闭所有中断,绝对不让系统中断影响当前代码的执行
回复

使用道具 举报

20

主题

110

回帖

170

积分

初级会员

积分
170
 楼主| 发表于 2018-10-14 23:35:03 | 显示全部楼层
taobaofarmer 发表于 2018-10-14 21:14
临界区就是关闭所有中断,绝对不让系统中断影响当前代码的执行

略懂了。
还有个就是任务切换问题,ucos不是通过时间片切换任务的吧,也就是如果一个任务的死循环里没有任务切换相关的函数:
while(1)
{
    LED0 = 1;
    delayms(500);//for循环阻塞延时
    LED0 = 0;
    delayms(500);
}
即使滴答中断发生了也还是在里面了是吧?
如果要切换任务就得用ucos的延时或者在后面调用OS_TASK_SW();之类的对吧?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106938
QQ
发表于 2018-10-15 01:25:21 | 显示全部楼层
推荐先把你楼主位的这种不规范的启动方式修改了,参考我们论坛置顶帖V4里面的例子,是官方推荐的启动方式。
好的,规范的RTOS架构,会让你以后的程序检查省不少事情。
回复

使用道具 举报

20

主题

110

回帖

170

积分

初级会员

积分
170
 楼主| 发表于 2018-10-16 23:26:11 | 显示全部楼层
eric2013 发表于 2018-10-15 01:25
推荐先把你楼主位的这种不规范的启动方式修改了,参考我们论坛置顶帖V4里面的例子,是官方推荐的启动方式。 ...

都得使用OSTaskCreateExt();吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106938
QQ
发表于 2018-10-17 01:34:47 | 显示全部楼层
飛饵 发表于 2018-10-16 23:26
都得使用OSTaskCreateExt();吗?

这个不限制。
规范的启动方式是在main函数里面仅创建一个启动任务即可,其它所有的工作都在启动任务里面完成。
回复

使用道具 举报

3

主题

43

回帖

52

积分

初级会员

积分
52
发表于 2018-10-17 08:38:50 | 显示全部楼层
创建任务的时候不需要临界保护吧。
回复

使用道具 举报

20

主题

110

回帖

170

积分

初级会员

积分
170
 楼主| 发表于 2018-10-17 16:01:52 | 显示全部楼层
eric2013 发表于 2018-10-17 01:34
这个不限制。
规范的启动方式是在main函数里面仅创建一个启动任务即可,其它所有的工作都在启动任务里面 ...

知道了。
我看了下置顶的资料,好像没有零基础的教程呢?什么信号量,互斥量,任务切换有几种方式这些都没怎么懂。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106938
QQ
发表于 2018-10-18 11:39:22 | 显示全部楼层
飛饵 发表于 2018-10-17 16:01
知道了。
我看了下置顶的资料,好像没有零基础的教程呢?什么信号量,互斥量,任务切换有几种方式这些都 ...

FreeRTOS教程对应章节,零基础基础知识点,非常重要,各个RTOS都一样。学习下
http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 01:49 , Processed in 0.181334 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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