nicho 发表于 2017-4-2 13:31:27

【RTOS】在Arduino上跑个系统吧(多任务并行)【二】

本帖最后由 nicho 于 2017-4-2 13:31 编辑

为了观看实验效果,这里我使用Proteus进行仿真
代码部分用三种颜色显示不用的任务

仿真文件:



来看一下代码吧-------------------------------------------------------------
#include <FreeRTOS_AVR.h>

const uint8_t LED_PIN_1 = 13;//定义第一个led
const uint8_t LED_PIN_2 = 12;//定义第二个led

volatile uint32_t count = 0;//计数用的变量

//------------------------------------------------------------------------------
//创建任务vLEDFlashTask_1,(必须按照这样的格式)
//**程序效果:每200ms闪烁一次led1,占空比1/3**
static void vLEDFlashTask_1(void *pvParameters) {
pinMode(LED_PIN_1, OUTPUT);//配置IO模式

// 每200ms闪烁一次.
for (;;) {//直接死循环,就是这么任性(因为RTOS会自动调度,不用担心)
    // 点亮
    digitalWrite(LED_PIN_1, HIGH);
   
    // 等待50ms
    vTaskDelay((50L * configTICK_RATE_HZ) / 1000L);
   
    // 熄灭
    digitalWrite(LED_PIN_1, LOW);
   
    // 等待150ms
    vTaskDelay((150L * configTICK_RATE_HZ) / 1000L);
}
}
//------------------------------------------------------------------------------
//创建任务vLEDFlashTask_2,(必须按照这样的格式)
//**程序效果:每200ms闪烁一次led2,占空比50%**
static void vLEDFlashTask_2(void *pvParameters) {
pinMode(LED_PIN_2, OUTPUT);//配置IO模式

// 每200ms闪烁一次.
for (;;) {//直接死循环,就是这么任性(因为RTOS会自动调度,不用担心)
    // 点亮
    digitalWrite(LED_PIN_2, HIGH);
   
    // 等待100ms
    vTaskDelay((100L * configTICK_RATE_HZ) / 1000L);
   
    // 熄灭
    digitalWrite(LED_PIN_2, LOW);
   
    // 等待100ms
    vTaskDelay((100L * configTICK_RATE_HZ) / 1000L);
}
}
//------------------------------------------------------------------------------
//创建任务vPrintTask,(必须按照这样的格式)
//**程序效果:每1s打印一次当前的count的值**
static void vPrintTask(void *pvParameters) {
while (1) {//直接死循环,就是这么任性(因为RTOS会自动调度,不用担心)
    // 等待1000ms
    vTaskDelay(configTICK_RATE_HZ);
   
    // 打印当前的计数Count
    Serial.print(F("Count: "));
    Serial.println(count);
    // Zero count.
    count = 0;
}
}
//------------------------------------------------------------------------------
void setup() {
Serial.begin(9600);
// 等待Leonardo响应
while(!Serial) {}

//======创建函数解读===================================================================================
// xTaskCreate(vLEDFlashTask_1,//对应任务的名称,比如这里的是vLEDFlashTask_1
//   "Task1",                  //这个名字没有实际用途,主要用来识别(just for human)
//   configMINIMAL_STACK_SIZE + 50, //栈的大小,栈简单的来说是数据的存放,栈越大,越不会溢出,但同时占用资源也越多,需要根据任务的实际需要来调整
//   NULL,
//   tskIDLE_PRIORITY + 2,//任务的优先级,这里的是2,需要说明的是0是优先级最低,最高优先级有上限,和芯片的资源以及RTOS本身有关
//   NULL);
//   
//   补充:configMINIMAL_STACK_SIZE,指loop()的栈(Task)大小,其他的任务在此基础上增加栈(Task)大小
//   补充:tskIDLE_PRIORITY,指loop()的优先级,其他任务需要在此基础上提高优先级
//====================================================================================================


// 创建vLEDFlashTask_1
xTaskCreate(vLEDFlashTask_1,
    "Task1",
    configMINIMAL_STACK_SIZE + 50,
    NULL,
    tskIDLE_PRIORITY + 3,
    NULL);

// 创建vLEDFlashTask_2
xTaskCreate(vLEDFlashTask_2,
    "Task2",
    configMINIMAL_STACK_SIZE + 50,
    NULL,
    tskIDLE_PRIORITY + 2,
    NULL);


// 创建vPrintTask
xTaskCreate(vPrintTask,
    "Task3",
    configMINIMAL_STACK_SIZE + 100,
    NULL,
    tskIDLE_PRIORITY + 1,
    NULL);

// 启动 FreeRTOS
vTaskStartScheduler();

while(1);
}
//------------------------------------------------------------------------------
void loop() {
while(1) {
    noInterrupts();
    count++;//每次+1
    //loop()中不要写其他程序了,全部以任务的形式创建好,在setup()中配置后,RTOS会根据各自任务的优先级,调度运行
    interrupts();
}
}


---------------------------------------------------------------------------------------------------------------------
实验效果





1:任务1,led每200ms闪烁一次,占空比1/3
2:任务2,led每200ms闪烁一次,占空比1/2
3:任务3,串口每1000ms打印一次count的值

代码



nicho 发表于 2017-4-2 13:36:09

本帖最后由 nicho 于 2017-4-2 13:37 编辑

占楼更新


[库的安装和示例]
【RTOS】在Arduino上跑个系统吧(多任务并行)【一】
https://mc.dfrobot.com.cn/thread-24089-1-1.html

[进阶程序解读]
【RTOS】在Arduino上跑个系统吧(多任务并行)【二】
https://mc.dfrobot.com.cn/thread-24100-1-1.html

.
.
.


luna 发表于 2017-4-5 17:41:28

{:5_168:}好内容!

Lii 发表于 2017-4-5 18:50:37

这是要自制操作系统的节奏吗...

zxy2266 发表于 2017-4-30 22:58:12

1.05版本不能用吗?编译出现很多错误,俺英文不好,不知道啥意识

nicho 发表于 2017-4-30 23:05:23

zxy2266 发表于 2017-4-30 22:58
1.05版本不能用吗?编译出现很多错误,俺英文不好,不知道啥意识

1.05是什么的版本?   另外,需要安装库文件哦,看看第一篇

zxy2266 发表于 2017-4-30 23:12:51

1.05R2 库装了没错

nicho 发表于 2017-4-30 23:50:15

zxy2266 发表于 2017-4-30 23:12
1.05R2 库装了没错

1.05是Arduino IDE的版本??  好像有点旧也,换个新点的IDE试试?

zdweb 发表于 2017-5-26 17:15:24

Proteus没用过。学习一下

q2017 发表于 2017-6-2 20:26:14

学习学习......................

全天假日 发表于 2017-6-5 14:38:27

生我独孤 发表于 2017-10-30 15:35:27

谢谢楼主,可以交流一下吗?和PT操作系统,那个更占用资源?

DFry6Vdy1Xr 发表于 2019-7-31 18:34:41

学习一下

gada888 发表于 2019-8-1 09:51:03

mark下,学习学习

joone 发表于 2019-8-17 10:32:25

好东西要收藏起来

20060606 发表于 2020-8-6 11:11:57

高科技啊~看不懂
页: [1]
查看完整版本: 【RTOS】在Arduino上跑个系统吧(多任务并行)【二】