3、任务创建与配置:在ConfigurationDesk中创建任务、任务属性设置、任务与核心的绑定

好,咱们进入第三章。这一章是实操性最强的一节,说白了就是手把手教你在ConfigurationDesk里把任务“造”出来,并且让它跑在正确的核心上。

我个人习惯把任务创建比作“搭积木”。你手里有RTOS这个底座,有多个核心作为“工位”,任务就是你要安排下去的“工序”。怎么搭?怎么安排?咱们一步步来。

3.1 在ConfigurationDesk中创建任务

打开ConfigurationDesk,找到左侧的“Tasks”标签页。右键点击,选择“New Task”。嗯,就这么简单。但这里有个坑——我刚开始用的时候,总以为创建完就完事了,结果一运行就报错。为什么?因为任务默认是“空壳子”,你得给它喂东西。

创建任务时,你需要指定:

  • 任务名称:别乱起,我建议用“Task_”+功能名,比如“Task_ControlLoop”。
  • 任务类型:周期性任务还是事件触发?大部分实时控制都用周期任务。
  • 初始状态:默认是“Ready”,但你可以设为“Suspended”,等某个条件再激活。

举个例子,创建一个10ms周期的控制任务:

// 在ConfigurationDesk中,右键Tasks -> New Task
// 属性设置如下:
Name: Task_ControlLoop
Type: Periodic
Period: 10 ms
Initial State: Ready

这里要注意,周期时间不是随便填的。我曾经在一个项目中,把周期设成了9.9ms,结果和另一个10ms的任务产生了微小的相位差,导致数据竞争。你想想看,这种问题排查起来多头疼?所以,周期尽量用整数,或者用基频的整数倍。

3.2 任务属性设置——细节决定成败

任务创建完了,属性设置才是重头戏。双击你创建的任务,会弹出属性窗口。这里我挑几个关键属性说说:

属性 说明 我的建议
Priority 优先级,数值越小优先级越高 控制任务给高优先级,日志任务给低优先级
Stack Size 栈大小,单位字节 别省,我一般给4KB起步,递归多的给8KB
Preemption 是否允许被抢占 关键任务建议设为“Non-Preemptive”
Schedule 调度策略:FIFO、RR等 多核环境下,我倾向用FIFO

这里有个避坑指南:栈大小。我曾经在一个项目中,为了省内存,把栈大小设为1KB。结果任务跑着跑着就崩了,查了两天才发现是栈溢出。从那以后,我每个任务都至少给4KB栈空间,调试阶段甚至给8KB。等稳定了再优化,不丢人。

还有一个属性容易被忽略——Affinity。这个属性决定了任务可以跑在哪些核心上。默认是“Any”,但咱们做多核优化,肯定要手动绑定。

3.3 任务与核心的绑定——把任务“钉”在核心上

任务与核心的绑定,是dSPACE多核优化的精髓。你想想看,如果不绑定,操作系统会随机把任务调度到任意核心上。这会导致什么问题?缓存命中率下降、核间通信开销增加。说白了,就是性能浪费。

在ConfigurationDesk中,绑定操作很简单:

  1. 选中任务,找到“Core Affinity”属性。
  2. 勾选你想要绑定的核心编号(Core0、Core1等)。
  3. 如果只勾选一个核心,那就是“独占”;勾选多个,就是“允许迁移”。

举个例子,把控制任务绑定到Core0,把通信任务绑定到Core1:

Task_ControlLoop:
    Core Affinity: Core0 (勾选)
    Priority: 1

Task_Communication:
    Core Affinity: Core1 (勾选)
    Priority: 5

这里有个技巧:关键任务尽量独占一个核心。我做过一个项目,把控制任务和日志任务都放在Core0上,结果控制周期抖动很大。后来把日志任务挪到Core1,抖动立刻消失了。为什么?因为日志任务有I/O操作,会阻塞核心,影响控制任务的实时性。

核心绑定原则:

  • 高实时性任务独占一个核心
  • I/O密集型任务和计算密集型任务分开
  • 有数据依赖的任务尽量绑在同一个核心或相邻核心

我的小技巧:在ConfigurationDesk里,可以用“Core View”视图直观地看到每个核心上绑定了哪些任务。我每次做完绑定,都会切到这个视图检查一遍,防止漏绑或绑错。

警告:不要把所有任务都绑到Core0上!我见过有人图省事,把所有任务都丢给Core0,结果Core0跑满了,其他核心在“摸鱼”。多核的优势就是并行,你得让每个核心都动起来。

3.4 实战中的一点体会

任务创建和配置,看起来是体力活,但其实是整个多核优化的基础。我记得有一次,一个同事跑来问我:“为什么我的任务跑着跑着就超时了?”我一看配置,他把三个周期任务都绑到了同一个核心上,而且优先级还设得一样。这不就是自己给自己挖坑吗?

所以,我的建议是:先规划,再动手。在创建任务之前,先在纸上画一个任务分配图:哪个任务跑哪个核心,优先级怎么排,周期怎么错开。画清楚了,再到ConfigurationDesk里操作,事半功倍。

嗯,这一章的内容就这些。下一章咱们聊聊任务间的同步与通信,那才是真正考验功力的地方。