搜索
bottom↓
回复: 6

MPU6050例程实验在加入UCOS后上位机采样速度降低

[复制链接]

出0入0汤圆

发表于 2016-7-28 09:59:22 | 显示全部楼层 |阅读模式
问题如题,用的是正点原子STM32的例程实验,试着添加了UCOS。因为是萌新,所以久久找不到原因,望大神指点。附上代码如下。
[code]#define START_TASK_PRIO  3  //任务优先级
#define START_STK_SIZE  256  //任务堆栈大小
OS_TCB StartTaskTCB;  //任务控制块
CPU_STK START_TASK_STK[START_STK_SIZE];  //任务堆栈
void start_task(void *p_arg);  //任务函数

#define TASK1_TASK_PRIO  4
#define TASK1_STK_SIZE  256  //任务堆栈大小
OS_TCB Task1_TaskTCB;
CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
void task1_task(void *p_arg);

//串口1发送1个字符
//c:要发送的字符
void usart1_send_char(u8 c)
{

出0入0汤圆

 楼主| 发表于 2016-7-28 10:02:43 | 显示全部楼层
main部分程序(只在main处添加了ucos)
  1. #define START_TASK_PRIO  3  //任务优先级
  2. #define START_STK_SIZE  256  //任务堆栈大小
  3. OS_TCB StartTaskTCB;  //任务控制块
  4. CPU_STK START_TASK_STK[START_STK_SIZE];  //任务堆栈
  5. void start_task(void *p_arg);  //任务函数

  6. #define TASK1_TASK_PRIO  4
  7. #define TASK1_STK_SIZE  256  //任务堆栈大小
  8. OS_TCB Task1_TaskTCB;
  9. CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
  10. void task1_task(void *p_arg);

  11. //串口1发送1个字符
  12. //c:要发送的字符
  13. void usart1_send_char(u8 c)
  14. {
  15.         while((USART1->SR&0X40)==0);//等待上一次发送完毕   
  16.         USART1->DR=c;          
  17. }
  18. //传送数据给匿名四轴上位机软件(V2.6版本)
  19. //fun:功能字. 0XA0~0XAF
  20. //data:数据缓存区,最多28字节!!
  21. //len:data区有效数据个数
  22. void usart1_niming_report(u8 fun,u8*data,u8 len)
  23. {
  24.         u8 send_buf[32];
  25.         u8 i;
  26.         if(len>28)return;        //最多28字节数据
  27.         send_buf[len+3]=0;        //校验数置零
  28.         send_buf[0]=0X88;        //帧头
  29.         send_buf[1]=fun;        //功能字
  30.         send_buf[2]=len;        //数据长度
  31.         for(i=0;i<len;i++)send_buf[3+i]=data[i];                        //复制数据
  32.         for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i];        //计算校验和       
  33.         for(i=0;i<len+4;i++)usart1_send_char(send_buf[i]);        //发送数据到串口1
  34. }
  35. //发送加速度传感器数据和陀螺仪数据
  36. //aacx,aacy,aacz:x,y,z三个方向上面的加速度值
  37. //gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值
  38. void mpu6050_send_data(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz)
  39. {
  40.         u8 tbuf[12];
  41.         tbuf[0]=(aacx>>8)&0XFF;
  42.         tbuf[1]=aacx&0XFF;
  43.         tbuf[2]=(aacy>>8)&0XFF;
  44.         tbuf[3]=aacy&0XFF;
  45.         tbuf[4]=(aacz>>8)&0XFF;
  46.         tbuf[5]=aacz&0XFF;
  47.         tbuf[6]=(gyrox>>8)&0XFF;
  48.         tbuf[7]=gyrox&0XFF;
  49.         tbuf[8]=(gyroy>>8)&0XFF;
  50.         tbuf[9]=gyroy&0XFF;
  51.         tbuf[10]=(gyroz>>8)&0XFF;
  52.         tbuf[11]=gyroz&0XFF;
  53.         usart1_niming_report(0XA1,tbuf,12);//自定义帧,0XA1
  54. }       
  55. //通过串口1上报结算后的姿态数据给电脑
  56. //aacx,aacy,aacz:x,y,z三个方向上面的加速度值
  57. //gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值
  58. //roll:横滚角.单位0.01度。 -18000 -> 18000 对应 -180.00  ->  180.00度
  59. //pitch:俯仰角.单位 0.01度。-9000 - 9000 对应 -90.00 -> 90.00 度
  60. //yaw:航向角.单位为0.1度 0 -> 3600  对应 0 -> 360.0度
  61. void usart1_report_imu(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw)
  62. {
  63.         u8 tbuf[28];
  64.         u8 i;
  65.         for(i=0;i<28;i++)tbuf[i]=0;//清0
  66.         tbuf[0]=(aacx>>8)&0XFF;
  67.         tbuf[1]=aacx&0XFF;
  68.         tbuf[2]=(aacy>>8)&0XFF;
  69.         tbuf[3]=aacy&0XFF;
  70.         tbuf[4]=(aacz>>8)&0XFF;
  71.         tbuf[5]=aacz&0XFF;
  72.         tbuf[6]=(gyrox>>8)&0XFF;
  73.         tbuf[7]=gyrox&0XFF;
  74.         tbuf[8]=(gyroy>>8)&0XFF;
  75.         tbuf[9]=gyroy&0XFF;
  76.         tbuf[10]=(gyroz>>8)&0XFF;
  77.         tbuf[11]=gyroz&0XFF;       
  78.         tbuf[18]=(roll>>8)&0XFF;
  79.         tbuf[19]=roll&0XFF;
  80.         tbuf[20]=(pitch>>8)&0XFF;
  81.         tbuf[21]=pitch&0XFF;
  82.         tbuf[22]=(yaw>>8)&0XFF;
  83.         tbuf[23]=yaw&0XFF;
  84.         usart1_niming_report(0XAF,tbuf,28);//飞控显示帧,0XAF
  85. }   


  86. int main(void)
  87. {
  88.         OS_ERR err;
  89.         CPU_SR_ALLOC();
  90.          
  91.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  92.         delay_init();                     //延时函数初始化          
  93.         uart_init(500000);                 //串口初始化为9600
  94.         usmart_dev.init(72);                //初始化USMART
  95.         LED_Init();                                          //初始化与LED连接的硬件接口
  96.         KEY_Init();                                        //初始化按键
  97.         MPU_Init();                                        //初始化MPU6050
  98.        
  99.         OSInit(&err);  //初始化UCOSIII
  100.         OS_CRITICAL_ENTER();  //进入临界区
  101.         //创建开始任务
  102.         OSTaskCreate ((OS_TCB       *)&StartTaskTCB,
  103.                   (CPU_CHAR     *)"start task",
  104.                   (OS_TASK_PTR   )start_task,
  105.                   (void         *)0,
  106.                   (OS_PRIO       )START_TASK_PRIO,  //优先级
  107.                   (CPU_STK      *)&START_TASK_STK[0],  //堆栈地址
  108.                                   (CPU_STK_SIZE  )START_STK_SIZE/10,  //堆栈深度限位
  109.                                   (CPU_STK_SIZE  )START_STK_SIZE,
  110.                                   (OS_MSG_QTY    )0,  //任务背部消息队列能够接收的最大消息数目,为0时禁止接收消息
  111.                                   (OS_TICK       )0,  //当使能时间片轮转时的时间片长度,为0时为默认长度
  112.                                   (void         *)0,
  113.                                   (OS_OPT        )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,  //任务选项
  114.                                   (OS_ERR       *)&err);
  115.         OS_CRITICAL_EXIT();        //退出临界区         
  116.         OSStart(&err);      //开启UCOSIII  
  117. }

  118. //开始任务
  119. void start_task(void *p_arg)
  120. {
  121.         OS_ERR err;
  122.         CPU_SR_ALLOC();
  123.        
  124.         CPU_Init();
  125. #if OS_CFG_STAT_TASK_EN>0u
  126.         OSStatTaskCPUUsageInit(&err);  //统计任务
  127. #endif
  128.        
  129. #ifdef CPU_CFG_INT_DIS_MEAS_EN  //如果使能了测量中断关闭时间
  130.         CPU_IntDisMeasMaxCurReset();
  131. #endif
  132.        
  133. #if OS_CFG_SCHED_LOCK_TIME_MEAS_EN  //当使用时间片轮转的时候
  134.         //使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,即1*5ms
  135.         OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
  136. #endif
  137.        
  138.         OS_CRITICAL_ENTER();  //进入临界区
  139.         //创建TASK1任务
  140.         OSTaskCreate((OS_TCB         * )&Task1_TaskTCB,               
  141.                                  (CPU_CHAR        * )"Task1 task",                
  142.                  (OS_TASK_PTR )task1_task,                        
  143.                  (void                * )0,                                       
  144.                  (OS_PRIO          )TASK1_TASK_PRIO,     
  145.                  (CPU_STK   * )&TASK1_TASK_STK[0],       
  146.                  (CPU_STK_SIZE)TASK1_STK_SIZE/10,       
  147.                  (CPU_STK_SIZE)TASK1_STK_SIZE,               
  148.                  (OS_MSG_QTY  )0,                                       
  149.                  (OS_TICK          )0,                                       
  150.                  (void           * )0,                                       
  151.                  (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
  152.                  (OS_ERR         * )&err);
  153.         OS_CRITICAL_EXIT();  //退出临界区
  154.         OSTaskDel((OS_TCB*)0,&err);  // 删除start任务自身
  155. }

  156. //task1任务函数
  157. void task1_task(void *p_arg)
  158. {
  159.         u8 t=0,report=1;                        //默认开启上报
  160.         u8 key;
  161.         float pitch,roll,yaw;                 //欧拉角
  162.         short aacx,aacy,aacz;                //加速度传感器原始数据
  163.         short gyrox,gyroy,gyroz;        //陀螺仪原始数据
  164.         short temp;                                        //温度            
  165.        
  166.         OS_ERR err;
  167.         CPU_SR_ALLOC();
  168.        
  169.         while(mpu_dmp_init())
  170.         {
  171.                 delay_ms(200);
  172.         }

  173.         while(1)
  174.         {
  175.                 key=KEY_Scan(0);
  176.                 if(key==KEY0_PRES)
  177.                 {
  178.                         report=!report;
  179.                 }
  180.                 if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
  181.                 {
  182.                         temp=MPU_Get_Temperature();        //得到温度值
  183.                         MPU_Get_Accelerometer(&aacx,&aacy,&aacz);        //得到加速度传感器数据
  184.                         MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);        //得到陀螺仪数据
  185.                         if(report)mpu6050_send_data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定义帧发送加速度和陀螺仪原始数据
  186.                         if(report)usart1_report_imu(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));
  187.                         if((t%10)==0)
  188.                         {
  189.                                 t=0;
  190.                                 LED0=!LED0;//LED闪烁
  191.                         }
  192.                 }
  193.                 t++;
  194.         }        
  195. }
复制代码

出0入0汤圆

 楼主| 发表于 2016-7-28 15:57:10 | 显示全部楼层
没人回帖嘛

出0入0汤圆

 楼主| 发表于 2016-7-28 18:31:41 | 显示全部楼层
好像是MPU_Get_Accelerometer(&aacx,&aacy,&aacz);        //得到加速度传感器数据
         MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);        //得到陀螺仪数据
这两个函数在UCOS的环境下跑得慢了点,为什么呢?怎么优化呢?

出0入0汤圆

发表于 2016-7-28 18:49:34 | 显示全部楼层
首先,你的TASK1任务没有OS_Delay()或其它的挂起操作,相当于TASK1独占CPU,当你有2个任务以上时,优先级低的任务根本就轮换不到。
其次,UCOS本身要占用一部份CPU时间(滴嗒时间),相对于裸机操作,任务的执行速度肯定是会慢的。

出0入0汤圆

 楼主| 发表于 2016-7-28 19:25:34 | 显示全部楼层
snic_k 发表于 2016-7-28 18:49
首先,你的TASK1任务没有OS_Delay()或其它的挂起操作,相当于TASK1独占CPU,当你有2个任务以上时,优先级低 ...

好的,谢谢,我试试

出0入0汤圆

 楼主| 发表于 2016-7-28 20:34:33 | 显示全部楼层
snic_k 发表于 2016-7-28 18:49
首先,你的TASK1任务没有OS_Delay()或其它的挂起操作,相当于TASK1独占CPU,当你有2个任务以上时,优先级低 ...

我把TASK1分成了两个任务,将数据采集和发送分开了,快了很多。再次感谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 08:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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