RISC-V技术论坛
直播中

camo3M

7年用户 17经验值
擅长:嵌入式技术
私信 关注
[经验]

【晶心科技ADP-Corvette-T1开发板试用体验】corvette T1的多任务调度学习

443f5eb26c4321bc388b005bbcea91fe

corvette T1多任务调度学习

本文尝试实现corvette T1开发板的多任务协作功能

多任务协作功能可以使用freeRTOS、RT-thread一类实时操作系统实现,也可以使用中断、任务调度器来实现这些功能在arduino中也都支持,因为并不清楚T1开发板支不支持实时操作系统所以本次暂不采用实时操作系统来实现(英文太差,不太看的懂手册QAQ,而且说明文档好像也没提这事?)。

最后我选择了任务调度器来实现T1开发板下的多任务调度,主要用到TaskScheduler这个库,在管理库中搜索并安装即可。

image-20220710153612129.png

先演示下其中的示例,打开个库中的Scheduler_example00_Blink这个示例,操作步骤:文件→示例→TaskScheduler→Scheduler_example00_Blink,如下图。

image-20220710154230957.png

修改LED_BUILTON为13

image-20220710154558688.png

修改前
image-20220710154716104.png

修改后
然后上传即可看到开头视频中的演示效果了。

多任务调度学习

然后又跟下面这位大佬的教程学习了多任务调度的操作(其实主要是学明白他的操作,自己还是太菜了QAQ)

(42条消息) Arduino|实现多任务操作,从此告别果奔6柒的博客-CSDN博客arduino多任务并行

首先是声明自己的回调函数

void t1Callback();

void t2Callback();
void t3Callback();

然后创建任务也就是Task的创建

Task t1(2000, 10, &t1Callback);//创建任务对象,内部参数为延迟时间,任务生存时间(s),任务的回调函数地址

Task t2(3000, TASK_FOREVER, &t2Callback);//回调函数主要是实现任务功能的
Task t3(5000, TASK_FOREVER, &t3Callback);

然后是调度器的创建,主要负责收纳、执行和删除这些任务的

Scheduler runner;

然后根据对象runner区访问类的成员函数

runner.init();

runner.addTask(name);//添加name任务,name为上面的Task 如t1或t2或t3
runner.deleteTask(name);
runner.execute();

更多的细节可以参考上面那篇文章,最后是T1开发板使用该文提供的代码跑出来的效果。

#include <TaskScheduler.h>

// Callback methods prototypes
void t1Callback();
void t2Callback();
void t3Callback();

//Tasks (delay_ms,times,func)
Task t4();
Task t1(2000, 10, &t1Callback);
Task t2(3000, TASK_FOREVER, &t2Callback);
Task t3(5000, TASK_FOREVER, &t3Callback);

Scheduler runner;

void t1Callback() {
Serial.print("t1: ");
Serial.println(millis());

if (t1.isFirstIteration()) { runner.addTask(t3); t3.enable(); Serial.println(&#34;t1: enabled t3 and added to the chain&#34;); } if (t1.isLastIteration()) { t3.disable(); runner.deleteTask(t3); t2.setInterval(500); Serial.println(&#34;t1: disable t3 and delete it from the chain. t2 interval set to 500&#34;); }

}

void t2Callback() {
Serial.print("t2: ");
Serial.println(millis());

}

void t3Callback() {
Serial.print("t3: ");
Serial.println(millis());

}

void setup () {
Serial.begin(115200);
Serial.println("Scheduler TEST");

runner.init();
Serial.println("Initialized scheduler");

runner.addTask(t1);
Serial.println("added t1");

runner.addTask(t2);
Serial.println("added t2");

t1.enable();
Serial.println("Enabled t1");
t2.enable();
Serial.println("Enabled t2");
}

void loop () {
runner.execute();
}

示例展示

image-20220710230703150.png

以上便是本文的所有内容了

谢谢阅读。

更多回帖

发帖
×
20
完善资料,
赚取积分