OS03-任务优先级及代码分析

1 任务静态优先级

  • AUTOSAR OS 将值 0 指定为操作系统中最低的任务优先级。数字越大,任务的优先级越高。

    如下图所示:

    • 1、Idle task的优先级为0。
    • 2、ResScheduler所代表的调度程序优先级是任务中最高的优先级. 也就是拥有这个资源「ResScheduler」的任务的优先级最高,不能被其他task抢占。
    • 3、中断的优先级总是高于任务的优先级。
      在这里插入图片描述
  • [在 AUTOSAR OS 中,优先级是静态分配给每个任务的,并且不能在运行时更改。不支持动态优先级管理。但是,在特定情况下,操作系统可以更改任务优先级,具体可参考优先级天花板协议。

  • 当执行重新调度时,调度器总是切换到就绪任务和正在运行的任务中优先级最高的任务。

2 任务优先级代码解析

2.1 优先级类型定义

一般优先级定义的类型取决于不同优先级任务的数量多少;uint8可以支持254个任务级数量(去除0和255,这两个预留给Idle和ResScheduler了)

 typedef   uint8  OsPriorityType
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
uCOS-III是一款实时操作系统,可以支持多任务并行执行。在uCOS-III中,创建任务需要使用OSTaskCreate函数。下面是一个简单的任务创建实验代码分析: ```c #include <includes.h> #define TASK_STK_SIZE 512 static OS_TCB Task1TCB; static CPU_STK Task1Stk[TASK_STK_SIZE]; static void Task1(void *p_arg); static OS_TCB Task2TCB; static CPU_STK Task2Stk[TASK_STK_SIZE]; static void Task2(void *p_arg); int main(void) { OS_ERR err; OSInit(&err); OSTaskCreate((OS_TCB *)&Task1TCB, (CPU_CHAR *)"Task1", (OS_TASK_PTR )Task1, (void *)0, (OS_PRIO )1, (CPU_STK *)&Task1Stk[0], (CPU_STK_SIZE)TASK_STK_SIZE/10, (CPU_STK_SIZE)TASK_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void *)0, (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), (OS_ERR *)&err); OSTaskCreate((OS_TCB *)&Task2TCB, (CPU_CHAR *)"Task2", (OS_TASK_PTR )Task2, (void *)0, (OS_PRIO )2, (CPU_STK *)&Task2Stk[0], (CPU_STK_SIZE)TASK_STK_SIZE/10, (CPU_STK_SIZE)TASK_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void *)0, (OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), (OS_ERR *)&err); OSStart(&err); return 0; } static void Task1(void *p_arg) { while(1) { printf("Task1 running...\n"); OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_HMSM_STRICT, NULL); } } static void Task2(void *p_arg) { while(1) { printf("Task2 running...\n"); OSTimeDlyHMSM(0, 0, 1, 0, OS_OPT_TIME_HMSM_STRICT, NULL); } } ``` 在这个实验代码中,首先定义了两个任务Task1和Task2,每个任务都是一个无限循环,每隔1秒输出一次任务名。 在main函数中,首先调用OSInit函数初始化uCOS-III,然后使用OSTaskCreate函数创建任务。对于每个任务,需要指定任务控制块(TCB)、任务名、任务入口函数、任务参数、任务优先级任务栈、任务栈大小、任务消息队列大小、任务定时器滴答数、任务扩展参数、任务选项和错误指针。在这个例子中,我们创建了两个任务Task1和Task2,分别使用优先级1和2,任务栈大小为512,任务栈使用数组Task1Stk和Task2Stk,任务入口函数分别为Task1和Task2。 最后,调用OSStart函数启动uCOS-III系统。在系统启动后,任务会自动并发执行,输出任务名。 需要注意的是,创建任务时需要根据实际应用场景合理设置任务优先级任务栈大小,以免出现任务堆栈溢出或优先级反转等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糖果Autosar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值