求教使用scoop库实现多线程的问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2726|回复: 4

[未解决] 求教使用scoop库实现多线程的问题

[复制链接]
发表于 2020-6-8 10:59 | 显示全部楼层 |阅读模式
近来想用Arduino做个工控版,必须用到多线程处理,    程序写完了  在Protues里面仿真都没有问题    下载到板子上就不能正常运行


  1. void setup()
  2. {
  3.   Serial.begin(9600);
  4.   Serial.print("setup");
  5.   attachInterrupt(1, counter, LOW); //脉冲输入
  6.   attachInterrupt(0, Stop, HIGH); //急停
  7.   pinMode(4, OUTPUT);         //音波测试
  8.   pinMode(5, OUTPUT);         //电磁阀
  9.   pinMode(6, INPUT_PULLUP); //启动
  10.   pinMode(7, OUTPUT);         //复位
  11.   pinMode(13, OUTPUT);        //led
  12.   digitalWrite(13,HIGH);
  13.   digitalWrite(7,HIGH);
  14.   Scheduler.startLoop(loop2);
  15.   Scheduler.startLoop(loop3);
  16.   Scheduler.startLoop(loop4);
  17.   Scheduler.startLoop(loop5);
  18.   Scheduler.start();
  19.   Serial.print(2);
  20. }

复制代码




这个是SETUP的程序    仿真的时候从串口接收到 setup2  逻辑都是正常的  
(2E9BERK2X5F42V~Y7H]P_5.png

下载到板子上  用串口助手  只接收到  se     
W03BA){(X({G`DNMWX(V^.png

随后板子就像死机一样   其他线程任务都无法执行

实在头疼找不到问题    仿真都行   下载到板子上就出问题了

以下是全部代码

  1. #include <SCoop.h>
  2. #include <EEPROM.h>
  3. double analog;
  4. char buff[10];
  5. unsigned char a, addr;
  6. unsigned int delay_time, work_time, cold_time;
  7. volatile unsigned char count = 0, temp = 0, start_flag = 0, display_flag = 0, shake_flag = 0, text_flag = 0;
  8. volatile unsigned long frq, run_time = 0, time_now = 0, time_old = 0;
  9. static unsigned char Frq_buff[7] = {0X6E, 0X30, 0X2E, 0X76, 0X61, 0X6C, 0X3D};         //ASCLL码   n0.val=
  10. static unsigned char Analog_buff[7] = {0X78, 0X30, 0X2E, 0X76, 0X61, 0X6C, 0X3D};      //ASCLL码   x0.val=
  11. static unsigned char End_buff[3] = {0XFF, 0XFF, 0XFF};                                 //结束符


  12. /********************************主程序区*****************************************/

  13. void setup()
  14. {
  15.   Serial.begin(9600);
  16.   Serial.print("setup");
  17.   attachInterrupt(1, counter, LOW); //脉冲输入
  18.   attachInterrupt(0, Stop, HIGH); //急停
  19.   pinMode(4, OUTPUT);         //音波测试
  20.   pinMode(5, OUTPUT);         //电磁阀
  21.   pinMode(6, INPUT_PULLUP); //启动
  22.   pinMode(7, OUTPUT);         //复位
  23.   pinMode(13, OUTPUT);        //led
  24.   digitalWrite(13,HIGH);
  25.   digitalWrite(7,HIGH);
  26.   Scheduler.startLoop(loop2);
  27.   Scheduler.startLoop(loop3);
  28.   Scheduler.startLoop(loop4);
  29.   Scheduler.startLoop(loop5);
  30.   Scheduler.start();
  31.   Serial.print(2);
  32. }
  33. void loop()
  34. {
  35.   //yield();
  36.    Serial.print(3);
  37.    Scheduler.delay(1000);
  38. }


  39. /********************************任务1程序区*****************************************/
  40. // 显示屏数据更新
  41. //defineTaskLoop(Task1)
  42. void loop2()
  43. {
  44.   if (display_flag)
  45.   {
  46.     Serial.write("task1");
  47.     analog = (double)(analogRead(A0) / 1023.00) * 5; //计算模拟量
  48.     frq = 2000 / (double)(run_time / 1000.00) * 1000; //频率计算
  49.     PrintFrq();
  50.     PrintAnalog();
  51.     Scheduler.delay(100);                               //刷新间隔
  52.   }
  53. }


  54. /********************************任务2程序区*****************************************/
  55. //控制程序
  56. //defineTaskLoop(Task2)
  57. void loop3()
  58. {
  59.   if (!digitalRead(6))
  60.   {
  61.     Serial.write("task2");
  62.     //LEDshake();
  63.     digitalWrite(5, HIGH);    //开电磁阀
  64.     Scheduler.delay(delay_time*10);        //延时启动
  65.     //sleep(100);
  66.     digitalWrite(4, HIGH);    //开超声
  67.     display_flag = 1;         //显示更新允许
  68.     Scheduler.delay(work_time*10);         //焊接延时
  69.     //sleep(200);
  70.     display_flag = 0;         //显示更新禁止
  71.     digitalWrite(4, LOW);     //关超声
  72.     Scheduler.delay(cold_time*10);         //冷却延时
  73.     //sleep(100);
  74.     if (shake_flag)
  75.     {
  76.       for (int i = 10; i > 0; i--)
  77.       {
  78.         digitalWrite(5, HIGH);
  79.         Scheduler.delay(200);                  //振动
  80.         digitalWrite(5, LOW);
  81.         Scheduler.delay(200);
  82.       }
  83.       shake_flag = 0;
  84.     }
  85.     else
  86.     {
  87.       digitalWrite(5, LOW);     //关电磁阀
  88.     }
  89.     start_flag = 0;           //清除标志
  90.   }

  91. }


  92. /********************************任务3程序区*****************************************/

  93. //defineTaskLoop(Task3)  //通讯
  94. void loop4()
  95. {
  96.   if (Serial.available())
  97.   {
  98.     Serial.write("tesk3");
  99.     a = Serial.available();
  100.     Serial.readBytes(buff, a);
  101.     switch (buff[0])
  102.     {
  103.       case 0x66 : text_flag = 1; break; //音波测试
  104.       case 0x99 : addr = buff[1]; break; //确定参数序号
  105.       case 0xaa : Data_change(); break; //修改参数
  106.       case 0xbb : Updata(); break;      //参数上传更新
  107.       case 0xcc : shake(); break;       //振落开关
  108.     }
  109.   }
  110.   Data_handle();          //数据转化
  111.   //Scheduler.delay(100);             //通讯数据处理间隔
  112. }


  113. /********************************任务4程序区*****************************************/

  114. //defineTaskLoop(Task4)  //音波测试
  115. void loop5()
  116. {
  117.   if (text_flag)
  118.   {
  119.     Serial.write("task4");
  120.     digitalWrite(4, HIGH);    //开超声
  121.     display_flag = 1;         //开频率更新
  122.     Scheduler.delay(1000);
  123.     display_flag = 0;
  124.     digitalWrite(4, LOW);
  125.     text_flag = 0;
  126.   }
  127. }


  128. /********************************中断程序区*****************************************/

  129. //脉冲定时  下降沿
  130. void counter()
  131. {
  132.   count++;                           //脉冲计数
  133.   if (count == 20)                   //以20Khz为标准0.1S  20*100=2000个脉冲更新一次频率
  134.   {
  135.     temp++;
  136.     time_now = micros();             //读时间
  137.     count = 0;                       //计数清零
  138.     run_time = time_now - time_old; //时间差
  139.     time_old = time_now;            //时间移位
  140.   }
  141. }

  142. //急停动作   上升沿
  143. void Stop()
  144. {
  145.   digitalWrite(4, LOW);     //关超声
  146.   digitalWrite(5, LOW);     //关电磁阀
  147.   digitalWrite(7, LOW);     //复位
  148.   delay(999999);            //如果复位失败,则假死机
  149. }
  150. /********************************函数程序区*****************************************/
  151. void PrintFrq()
  152. {
  153.   unsigned char data[5];
  154.   data[4] = frq % 10 + 0x30;
  155.   data[3] = frq / 10 % 10 + 0x30;
  156.   data[2] = frq / 100 % 10 + 0x30;
  157.   data[1] = frq / 1000 % 10 + 0x30;
  158.   data[0] = frq / 10000 % 10 + 0x30;
  159.   Serial.write(Frq_buff, 7);
  160.   Serial.write(data, 5);
  161.   Serial.write(End_buff, 3);
  162. }

  163. void PrintAnalog()
  164. {
  165.   unsigned char data[3];
  166.   data[2] = (unsigned int)(analog * 100) % 10 + 0x30;
  167.   data[1] = (unsigned int)(analog * 100) / 10 % 10 + 0x30;
  168.   data[0] = (unsigned int)(analog * 100) / 100 % 10 + 0x30;
  169.   Serial.write(Analog_buff, 7);
  170.   Serial.write(data, 3);
  171.   Serial.write(End_buff, 3);
  172. }


  173. void Data_change()
  174. {
  175.   while (1)
  176.   {
  177.     if (a == 6)
  178.     {
  179.       EEPROM.write(addr * 10 , buff[1]); //规定  延时数据三位HEX   范围 0.00s~9.99s
  180.       EEPROM.write(addr * 10 + 1, buff[3]);
  181.       EEPROM.write(addr * 10 + 2, buff[4]); break;
  182.     }

  183.     if (a == 5)
  184.     {
  185.       EEPROM.write(addr * 10 , buff[1]);
  186.       EEPROM.write(addr * 10 + 1 , buff[3]);
  187.       EEPROM.write(addr * 10 + 2 , 0); break;
  188.     }
  189.     if (a == 3)
  190.     {
  191.       EEPROM.write(addr * 10 , buff[1]);
  192.       EEPROM.write(addr * 10 + 1, 0);
  193.       EEPROM.write(addr * 10 + 2, 0); break;
  194.     }
  195.   }

  196. }


  197. void Updata()
  198. {
  199.   int i, j;
  200.   for (i = 1; i < 4; i++)
  201.   {
  202.     Serial.write(Frq_buff, 7);
  203.     Frq_buff[1] += 1;
  204.     for (j = 0; j < 3; j++)
  205.     {
  206.       Serial.write(EEPROM.read(i * 10 + j));   //数据地址 10 11 12 20 21 22 30 31 32
  207.     }
  208.     Serial.write(0xff);
  209.     Serial.write(0xff);
  210.     Serial.write(0xff);
  211.   }
  212.   Frq_buff[1] = 0x30;

  213. }


  214. void Data_handle()               //数据处理  规定delaytime 10 11 12 worktime 20 21 22 coldtime 30 31 32
  215. {
  216.   delay_time = (unsigned int)(EEPROM.read(10) - 0x30) * 100 + (unsigned int)(EEPROM.read(11) - 0x30) * 10 + (unsigned int)(EEPROM.read(12) - 0x30);
  217.   work_time = (unsigned int)(EEPROM.read(20) - 0x30) * 100 + (unsigned int)(EEPROM.read(21) - 0x30) * 10 + (unsigned int)(EEPROM.read(22) - 0x30);
  218.   cold_time = (unsigned int)(EEPROM.read(30) - 0x30) * 100 + (unsigned int)(EEPROM.read(31) - 0x30) * 10 + (unsigned int)(EEPROM.read(32) - 0x30);
  219. }


  220. void shake()
  221. {
  222.   if (buff[1] == 0x00)
  223.   {
  224.     shake_flag = 1;
  225.   }
  226.   else
  227.   {
  228.     shake_flag = 0;
  229.   }
  230. }


  231. void EEPROMwrite()
  232. {
  233.   EEPROM.write(10,0x32);
  234.   EEPROM.write(11,0x30);
  235.   EEPROM.write(12,0x30);
  236.   EEPROM.write(20,0x34);
  237.   EEPROM.write(21,0x30);
  238.   EEPROM.write(22,0x30);
  239.   EEPROM.write(30,0x32);
  240.   EEPROM.write(31,0x30);
  241.   EEPROM.write(32,0x30);

  242.   }
复制代码


发表于 2022-5-25 08:54 | 显示全部楼层
我的理解是SCoop线程不能处理太多,板子跑不过来,SCoop库好像使用的是分时处理任务,线程太多,分时多,板子处理不过来。我最近也很头疼这个东西,想着搞多线程arduino uno。不知楼主最后怎么解决的。
 楼主| 发表于 2022-5-25 09:03 来自手机 | 显示全部楼层
赤奥烟 发表于 2022-5-25 08:54
我的理解是SCoop线程不能处理太多,板子跑不过来,SCoop库好像使用的是分时处理任务,线程太多,分时多,板 ...

两年前的东西了。 我记得是版本问题    下载老版本IDE就行了 新版的不兼容这个库
 楼主| 发表于 2022-5-25 09:04 来自手机 | 显示全部楼层
赤奥烟 发表于 2022-5-25 08:54
我的理解是SCoop线程不能处理太多,板子跑不过来,SCoop库好像使用的是分时处理任务,线程太多,分时多,板 ...

想跑RTOS 8位单片机勉强了  上STM32吧
发表于 2022-6-18 12:05 | 显示全部楼层
JULI 发表于 2022-5-25 09:03
两年前的东西了。 我记得是版本问题    下载老版本IDE就行了 新版的不兼容这个库 ...

大佬能说一下哪个版本之前的IDE可以兼容吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 02:55 , Processed in 0.185205 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表