
ucos
该专栏是为了记录和分享ucos,在学习和工作中遇到的工作问题
weixin_44799641
这个作者很懒,什么都没留下…
展开
-
usoc3 为什么 不能在中断服务函数中创建任务?
在中断服务函数中创建任务后,需要立即考虑新任务的调度问题,这会使中断处理流程变得复杂。而且,新创建的任务可能会改变系统的任务调度格局,导致原有的任务调度计划被打乱,增加了系统调度的不确定性。创建任务涉及到对系统资源的分配和数据结构的修改,如任务控制块(TCB)的初始化、就绪列表的更新等。中断服务函数执行时可能会打断其他任务的正常执行,如果在中断中创建任务,可能会导致这些资源在不一致的状态下被访问,引发数据冲突和错误。在中断服务函数中执行创建任务的代码会增加中断的处理时间,导致中断响应时间变长。原创 2025-04-13 10:26:42 · 97 阅读 · 0 评论 -
OSTaskCreateExt()
灵活配置任务属性:相比基础的任务创建函数,OSTaskCreateExt 允许开发人员更细致地配置任务相关属性,如通过 opt 参数设置堆栈检查、清空等功能,通过 pext 扩展任务控制块存储额外信息等,满足不同应用场景对任务管理的多样化需求。:用于存储任务操作相关信息的选项,比如可通过它设置是否进行堆栈检查(OS_TASK_OPT_STK_CHK) 、是否清空堆栈(OS_TASK_OPT_STK_CLR)等。:定义一个指向数据结构的指针,用于扩展任务控制块(TCB) ,可存储一些与任务相关的额外信息。原创 2025-04-11 10:39:56 · 328 阅读 · 0 评论 -
UCOS-II 和 UCOS-III ,的差别大吗?
UCOS-II:使用固定优先级抢占式调度算法,每个任务都有一个唯一的优先级,高优先级任务可以随时抢占低优先级任务的 CPU 使用权。UCOS-II:支持的任务数量上限为 64 个(包含系统任务),这在一些小型嵌入式系统中足够使用,但对于复杂的大型系统而言,可能会受到任务数量的限制。UCOS-III:支持内存保护机制,通过设置内存保护区域,防止任务之间的非法内存访问,提高了系统的安全性和可靠性。UCOS-III:支持中断嵌套,允许在中断处理过程中响应更高优先级的中断,提高了系统的实时性和响应能力。原创 2025-04-09 08:53:44 · 722 阅读 · 0 评论 -
PC_VectSet(0x08, OSTickISR);是什么意思?
一般而言,OSTickISR 是系统时钟节拍中断服务子程序,它会在每个时钟节拍到来时被调用,主要用于更新系统的时钟信息、处理任务调度等操作。这行代码调用了 PC_VectSet 函数,其目的是把中断向量表中地址为 0x08 的中断向量设置为 OSTickISR。main 函数:在 main 函数中,调用 PC_VectSet 函数设置中断向量,然后模拟中断触发,调用对应的中断服务子程序。OSTickISR 函数:这是一个简单的中断服务子程序,当中断触发时,会输出一条信息。// 定义中断服务子程序类型。原创 2025-04-08 17:50:45 · 337 阅读 · 0 评论 -
void OSTimeDly (INT32U ticks), 函数的详细解读?
if OS_CRITICAL_METHOD == 3u:这是一个条件编译指令,若 OS_CRITICAL_METHOD 的值为 3,则会定义一个 OS_CPU_SR 类型的变量 cpu_sr 并初始化为 0。:OSTCBCur 指向当前正在运行的任务的任务控制块,OSTCBY 是任务控制块中的一个成员,代表任务在就绪表中的 Y 坐标。综上所述,这段代码实现了任务的延时功能,并且在执行延时操作前会进行必要的检查,以确保操作的安全性和正确性。:调用调度函数 OS_Sched(),重新选择下一个要运行的任务。原创 2025-04-01 14:59:49 · 493 阅读 · 0 评论 -
OSSemCreate是 uC/OS-II 实时操作系统中用于创建信号量的函数
在上述示例中,首先在 Task1 函数中使用 OSSemCreate 创建了一个初始计数值为 3 的信号量。然后任务通过 OSSemPend 函数等待信号量,获取到信号量后执行需要保护的代码段,最后通过 OSSemPost 函数释放信号量,以便其他任务可以获取该信号量。例如,若创建一个初始计数值为 5 的信号量,意味着系统中初始时有 5 个单位的某种资源可供任务使用。该指针用于后续对信号量的操作,如等待信号量、释放信号量等。OSSemCreate是 uC/OS-II 实时操作系统中用于创建信号量的函数。原创 2025-03-24 14:06:33 · 224 阅读 · 0 评论 -
void OSTaskNameSet (INT8U prio, INT8U *pname, INT8U *)函数的作用
OSTaskNameSet 是 uC/OS-II(一种广泛应用的嵌入式实时操作系统)中的一个函数,其作用是为指定优先级的任务设置一个可读的名称。在这个示例中,我们创建了一个任务,并使用 OSTaskNameSet 函数为该任务设置了一个名称 “My Task”。同时,我们检查了函数返回的错误码,以确保操作成功。该函数的主要功能是为指定优先级的任务赋予一个用户自定义的名称。在调试和监控系统时,为任务设置名称可以让开发者更直观地识别各个任务,方便定位问题和了解系统的运行状态。// 定义任务优先级。原创 2025-03-24 11:33:22 · 178 阅读 · 0 评论 -
OS_TASK_OPT_STK_CHK,OS_TASK_OPT_STK_CLR,OS_TASK_OPT_SAVE_FP 和OS_TASK_OPT_NO_TLS的意义和作用?
当发生任务切换时,如果不保存浮点寄存器的内容,新任务可能会覆盖之前任务在浮点寄存器中的数据,导致旧任务恢复执行时出现计算错误。当在OSTaskCreateExt函数的opt参数中包含这个宏时,操作系统会在运行过程中检查任务堆栈的使用情况,以确保没有发生堆栈溢出等问题。含义:这个宏定义的值是0x0002u ,表示在任务创建时清空任务的堆栈。这样在任务切换时,操作系统会自动保存当前任务浮点寄存器的内容,并在该任务恢复执行时恢复这些内容,确保浮点运算的连续性和正确性。原创 2025-03-24 10:59:44 · 319 阅读 · 0 评论 -
OS_TMR_CFG_MAX 是 μC/OS-II 实时操作系统里用于配置定时器管理模块的一个重要常量
OS_TMR_CFG_MAX 代表的是系统中允许创建的最大定时器数量。而 OS_TMR_CFG_MAX 就限定了整个系统能够同时存在的定时器的最大数目。总之,OS_TMR_CFG_MAX 是一个需要开发者根据实际情况进行合理配置的重要常量,它对于系统的资源管理和性能优化起着关键作用。#define OS_TMR_CFG_MAX 20 // 允许创建的最大定时器数量为 20。在上述示例中,将 OS_TMR_CFG_MAX 设置为 20,表示系统最多可以创建 20 个定时器。原创 2025-03-21 11:31:51 · 382 阅读 · 0 评论 -
C/OS-II 实时操作系统中,钩子函数的作用是什么?
综上所述,钩子函数为开发者提供了一种灵活的方式来扩展和定制操作系统的功能,使得系统能够更好地满足不同应用场景的需求。原创 2025-03-21 11:03:15 · 345 阅读 · 0 评论 -
OSTimeDly 是 μC/OS-II 操作系统提供的一个函数,它的作用是让当前任务进入延时状态,暂停执行一段时间,直到延时时间结束后
OSTimeDly 是 μC/OS-II 操作系统提供的一个函数,它的作用是让当前任务进入延时状态,暂停执行一段时间,直到延时时间结束后,任务才会重新进入就绪状态,等待操作系统的调度。中,参数为 2,意味着当前任务将被延时 2 个时钟节拍。需要注意的是,在任务延时期间,操作系统会调度其他就绪的任务运行,以充分利用 CPU 资源,保证系统的实时性和多任务并发执行的效果。时钟节拍是由操作系统的定时器中断产生的,每个时钟节拍的时间间隔是固定的,通常由系统配置决定(比如 10 毫秒、1 毫秒等)。原创 2025-03-21 09:59:36 · 401 阅读 · 0 评论 -
OS_TASK_STAT_STK_CHK_EN是 μC/OS-II 操作系统中的一个配置常量。
如前文所述,如果OS_TASK_STAT_EN被设置为 0(即统计任务未启用),但只要OS_TASK_STAT_STK_CHK_EN为 1,用户仍可在自己的任务中手动调用OS_TaskStatStkChk()函数来检查堆栈使用情况。而当OS_TASK_STAT_EN被设置为 1 时,若OS_TASK_STAT_STK_CHK_EN也为 1,那么统计任务将按照设定的频率(通常是每秒)自动调用相关函数来确定每个活动任务的堆栈大小,实现对任务堆栈使用情况的实时监控。若被定义为 0,则禁止此功能。原创 2025-03-20 19:33:35 · 237 阅读 · 0 评论 -
OS_TASK_STAT_STK_SIZE 是 μC/OS-II 实时操作系统中的一个关键配置参数
OS_TASK_STAT_STK_SIZE 是 μC/OS-II 实时操作系统中的一个关键配置参数,下面将对其进行详细介绍:基本概念在 μC/OS-II 里,统计任务主要用于收集系统的运行统计信息,像 CPU 使用率这类重要指标就是由它来统计的。而 OS_TASK_STAT_STK_SIZE 这个参数,就是用来规定统计任务所使用的堆栈大小的。需要注意的是,它并非以字节为单位来衡量堆栈大小,而是以 OS_STK 类型的元素数量来表示。之所以这样设计,是因为不同处理器的字长存在差异,OS_STK 类型会依据具原创 2025-03-20 15:40:31 · 257 阅读 · 0 评论 -
OS_TASK_TMR_STK_SIZE 是 μC/OS-II 实时操作系统里的一个关键配置参数,主要用于设定定时器任务堆栈的大小
OS_TASK_TMR_STK_SIZE 所定义的就是定时器任务所使用的堆栈的大小。需要注意的是,OS_TASK_TMR_STK_SIZE 规定的堆栈大小不是以字节为单位,而是以 OS_STK 类型的元素数量来表示。在这个示例中,OS_TASK_TMR_STK_SIZE 被设置为 256,即定时器任务的堆栈大小为 256 个 OS_STK 类型的元素。OS_TASK_TMR_STK_SIZE 是 μC/OS-II 实时操作系统里的一个关键配置参数,主要用于设定定时器任务堆栈的大小。原创 2025-03-20 15:22:44 · 462 阅读 · 0 评论 -
OS_TICK_STEP_EN 是 μC/OS-II 实时操作系统里的一个配置参数,它主要和系统时钟节拍处理的调试功能相关
在 μC/OS-II 中,时钟节拍是系统运行的基础,它以固定的时间间隔产生,用于驱动系统的任务调度、超时管理、延时处理等功能。OS_TICK_STEP_EN 能够开启一种特殊的调试模式,让开发者借助 μC/OS - View 工具来精确控制时钟节拍的处理。在上述示例中,OS_TICK_STEP_EN 被设置为 1,以启用时钟节拍单步执行功能;// 在 os_cfg.h 文件中配置 OS_TICK_STEP_EN 和 OS_TIME_TICK_HOOK_EN。// 这里可以放置对时间要求严格的任务代码。原创 2025-03-20 11:49:09 · 215 阅读 · 0 评论 -
OS_MAX_QS 是 μC/OS-II 实时操作系统里的一个重要配置参数
在 μC/OS-II 中,消息队列(Queue)是一种实现任务间通信的机制。任务可以通过消息队列来发送和接收消息,以实现数据的传递和同步。OS_MAX_QS 用于指定系统中能够创建的最大消息队列数量。在这个示例中,OS_MAX_QS 被设置为 10,这意味着系统最多可以创建 10 个消息队列。在 main 函数中,尝试创建了一个消息队列,如果创建成功,会执行相应的处理逻辑。// 在 os_cfg.h 文件中设置 OS_MAX_QS。// 初始化 μC/OS-II。原创 2025-03-20 11:22:13 · 408 阅读 · 0 评论 -
OS_MAX_MEM_PART 是 μC/OS-II 实时操作系统中的一个重要配置参数
在 μC/OS-II 里,为了高效管理内存,引入了内存分区(Memory Partition)的概念。内存分区是将一块连续的内存区域划分成多个大小相同的内存块,任务可以从这些分区中申请和释放内存块。在这个示例中,OS_MEM_EN 被设置为 1 以启用内存分区管理功能,OS_MAX_MEM_PART 被设置为 5,表示应用程序最多可以创建 5 个内存分区。// 在 os_cfg.h 文件中设置 OS_MAX_MEM_PART 和 OS_MEM_EN。// 定义内存分区所需的内存块数组。原创 2025-03-20 10:55:41 · 217 阅读 · 0 评论 -
OS_MAX_EVENTS 是 μC/OS-II 实时操作系统中的一个重要配置参数
在 μC/OS-II 里,事件是实现任务间同步和通信的关键机制,常见的事件对象有信号量、互斥量、邮箱和消息队列等。OS_MAX_EVENTS 用于定义系统中能够创建的最大事件对象数量。在这个示例中,OS_MAX_EVENTS 被设置为 20,这意味着系统最多可以创建 20 个事件对象。OS_MAX_EVENTS 是 μC/OS-II 实时操作系统中的一个重要配置参数,下面为你详细介绍它的相关内容。// 在 os_cfg.h 文件中设置 OS_MAX_EVENTS。// 初始化 μC/OS-II。原创 2025-03-20 10:41:37 · 150 阅读 · 0 评论 -
OS_LOWEST_PRIO 是 μC/OS-II 实时操作系统里的一个关键配置参数,用于设定应用程序中所使用的最低任务优先级
OS_MAX_TASKS 规定了系统中最多可创建的任务数量,而 OS_LOWEST_PRIO 确定的是任务的最低优先级,二者相互独立。例如,你可以设置 OS_MAX_TASKS 为 15,OS_LOWEST_PRIO 为 40,这意味着系统最多能创建 15 个任务,且每个任务的优先级可在 0 到 38 之间选择。鉴于系统保留了 OS_LOWEST_PRIO 和 OS_LOWEST_PRIO - 1 这两个优先级,所以应用程序任务的有效优先级范围是从 0 到 OS_LOWEST_PRIO - 2。原创 2025-03-20 10:33:46 · 579 阅读 · 0 评论 -
OSEventNameSet 是 μC/OS-II 实时操作系统中的一个函数,主要用于为事件对象(如信号量、互斥量、邮箱或消息队列)分配一个自定义的名称
OSEventNameSet 是 μC/OS-II 实时操作系统中的一个函数,主要用于为事件对象(如信号量、互斥量、邮箱或消息队列)分配一个自定义的名称。以下为你详细介绍其功能、原型、参数、返回值、使用示例以及注意事项。在调试和系统监控时,给事件对象赋予一个有意义的名称有助于开发者更直观地识别和区分不同的事件,提高调试效率和代码的可维护性。OSEventNameSet 函数就提供了这样的功能,允许开发者为事件对象设置名称。// 调用 OSEventNameSet 函数设置信号量名称。// 设置信号量名称。原创 2025-03-20 09:53:19 · 260 阅读 · 0 评论 -
OS_DEBUG_EN 是 μC/OS-II 实时操作系统中的一个配置宏
/ os_cfg.h 文件中配置 OS_DEBUG_EN。// OS_DEBUG.C 文件中定义调试信息。// 定义 μC/OS-II 的版本号。// 定义 OS_TCB 的大小。// 定义事件标志组的大小。原创 2025-03-20 09:19:31 · 376 阅读 · 0 评论 -
OS_CPU_HOOKS_EN 用于指示 OS_CPU_C.C 文件是否声明钩子函数(设置为 1 时声明,设置为 0 时不声明)。
OS_CPU_HOOKS_EN 用于控制是否启用 μC/OS-II 系统中的 CPU 相关钩子函数。μC/OS-II 中有多个与 CPU 相关的钩子函数,这些函数通常在 os_cpu_c.c 文件中定义。#define OS_CPU_HOOKS_EN 1u // 启用 CPU 钩子函数。// os_cfg.h 文件中定义 OS_CPU_HOOKS_EN。// os_cpu_c.c 文件中实现钩子函数。// 在这里添加系统初始化前的额外操作。// 在这里添加系统初始化后的额外操作。原创 2025-03-20 09:09:39 · 248 阅读 · 0 评论 -
OS_ARG_CHK_EN是 μC/OS-II 中的一个配置参数,用于控制函数参数检查功能的开启或关闭。
如果OS_ARG_CHK_EN大于 0,函数会检查这些参数是否有效,如果无效则返回相应的错误代码。在 μC/OS-II 的任务创建函数OSTaskCreate()中,当OS_ARG_CHK_EN启用时,会检查传入的任务函数指针、任务参数、任务堆栈指针以及任务优先级等参数的有效性。OS_ARG_CHK_EN是 μC/OS-II 中的一个配置参数,用于控制函数参数检查功能的开启或关闭。原创 2025-03-20 08:57:39 · 193 阅读 · 0 评论 -
OSSchedLock() 是 μC/OS-II(一个嵌入式实时操作系统)中的一个函数
当调用该函数后,μC/OS-II 的任务调度器将被禁止进行任务切换,直到调用 OSSchedUnlock() 函数解锁调度器。这意味着在调度器被锁定期间,即使有更高优先级的任务就绪,也不会发生任务切换,当前正在运行的任务会继续执行。在上述示例中,Task1 任务在执行关键代码时调用 OSSchedLock() 锁定调度器,确保关键代码的执行不会被其他任务打断,执行完关键代码后,调用 OSSchedUnlock() 解锁调度器,恢复任务调度。// 初始化 μC/OS-II。// 任务 2 的操作。原创 2025-03-20 08:43:29 · 541 阅读 · 0 评论 -
OSTimeDlyHMSM()
通过调用该函数,当前正在运行的任务会放弃 CPU 使用权,进入等待状态,直到指定的延时时间结束,才会重新参与任务调度。在这个示例中,TaskStart 任务会先执行一些操作,然后调用 OSTimeDlyHMSM 函数延时 5 秒,之后再次执行任务操作,如此循环。任务调度:在任务延时期间,uC/OS-II 会调度其他就绪的任务运行,因此要确保系统中有足够的任务可以运行,避免出现任务饥饿的情况。OS_TIME_ZERO_DLY:输入的延时时间为 0,函数不会让任务进入延时状态。// 任务要执行的操作。原创 2025-03-13 20:52:36 · 378 阅读 · 0 评论