• 实时控制第二次作业


    一.例程编译

    1.开发环境搭建

    从老师github上git例程:

    # mkdir work
    # cd work
    # git clone https://github.com/cbhust/STM32F429_Discovery_FreeRTOS_9.git
    

    2.QEMU安装

    下载二进制文件 gnuarmeclipse-qemu-debian64-2.8.0-201612271623-dev.tgz到~/work目录
    在工作目录解压缩文件
    #tar xvf gnuarmeclipse-qemu-debian64-2.8.0-201612271623-dev.tgz
    #chmod -R -w ./qemu

    为避免每次关闭ternimal都需要添加路径,在自己的home目录下修改 .bashrc文件,在其末尾添加

    export PATH=~/work/qemu/2.8.0-201612271623-dev/bin/:$PATH

    #ls -a | grep bash
    #vi  .bashrc
    

    3.编译仿真

    在/Projects/Demo1目录下运行make生成hello_rtos.elf文件
    运行脚本文件

    #cd  ~/work/STM32F429_Discovery_FreeRTOS_9/Projects/Demo1
    #make
    #./qemu.sh
    

    运行结果:

    红灯每闪两次,绿灯闪一次。可能是VMware没设置好或者版本问题导致GUI无法显示,目前问题还没解决。

    4.GDB调试

    在/Projects/Demo1目录下运行qemu_gdb脚本文件
    下载gbd:

    #./qemu_gdb
    #sudo apt-get install gdb-arm-none-eabi
    

    发现报错如下:

    网上搜索发现解决方法:

    #sudo apt-get -o Dpkg: :Options: :="- -force-overwrite" install gdb-arm-none-eabi
    

    在新打开的终端输入:

    #arm-none-eabi-gdb
    (gdb)target remote localhost:1234
    (gdb)continue
    

    qemu开始执行程序:

    二.编写任务

    1.基本思路

    使用FreeRTOS的任务间通信和同步API和队列机制完成数据的收发,Sender_Task每2ms向队列发送一次数据并且将数据累加,将值存到Reciever_Task
    每1000ms向队列收取一次数据,必须保证一次性将队列中所有数据全部收取,并将收取的数据累加,Monitor_Task每10000ms比较一次收发程序
    的累加值是否相等,如果相等则绿灯亮1000ms表示正确接收, 否则红灯亮1000ms表示没有正确接收。

    2.Sender_Task

    void Sender_Task(void *pvParameters)
    
     {
     
              uint32_t SendNum=1;
    
              while(1)
    
         {
    
                 /*向队列中填充内容*/
    
                 xQueueSend(MsgQueue,(void* )&SendNum,0);
    
                 SendFlag=SendFlag+SendNum;
    
                 SendNum++;
    
                 if(SendNum==10000)
    
                 {
    
                    uint32_t SendNum=1;
    
                 }
    
                 vTaskDelay(2);
    
         }       
    
    }
    

    3.Reciever_Task

    如果项目成功被队列接收返回pdTRUE ,否则返回 pdFALSE,如果返回pdTRUE则继续接收,设置延迟为0,一直到返回pdFALSE
    则表示队列收取完毕,停止接收。

    void Receiver_Task(void *pvParameters)
    
    {
    
         uint32_t ReceiverNum=0;
    
    
    
         while(1)
    
         {
    
                 /*向队列中获取内容*/
    
                while(xQueueReceive(MsgQueue,&ReceiverNum,
    
                 0/portTICK_RATE_MS ) == pdTRUE )
    
                 {
    
                  ReceiverFlag=ReceiverFlag+ReceiverNum;
    
                 }
    
                 vTaskDelay(1000);
    
         }       
    
    }
    

    4.Monitor_Task

    void  Monitor_Task(void)
    
    {
    
       while(1)
    
       {
    
         /*接收成功绿灯亮 否则红灯亮*/
    
        if(ReceiverFlag == SendFlag)
    
         {
    
          Green_LED_On();
    
          vTaskDelay(1000);
    
          Green_LED_Off();
    
         }
    
         else
    
         {
    
          Red_LED_On();
    
          vTaskDelay(1000);
    
          Red_LED_Off();
    
         }
    
         vTaskDelay(10000);
    
       }
    
    }
    

    5.main()

    int main(void)
    
    {
            /*建立队列*/
    
        MsgQueue=xQueueCreate(30000,sizeof(uint32_t));
    
        /*建立任务*/
    
        xTaskCreate(
    
                    Sender_Task,
    
                    (signed portCHAR *)"Sender_Task",
    
                    configMINIMAL_STACK_SIZE,
    
                    (void*) NULL,
    
                    tskIDLE_PRIORITY+4UL,
    
                    NULL
    
                   );
    
         xTaskCreate(
    
                    Receiver_Task,
    
                    (signed portCHAR *)"Receiver_Task",
    
                    configMINIMAL_STACK_SIZE,
    
                    (void*) NULL,
    
                    tskIDLE_PRIORITY+3UL,
    
                    NULL
    
                   );
    
         xTaskCreate(
    
                    Monitor_Task,
    
                    "Monitor_Task",
    
                    configMINIMAL_STACK_SIZE,
    
                    (void*) NULL,
    
                    tskIDLE_PRIORITY+2UL,
    
                    NULL
    
                   );
    
    
    
                               
    
    /* Start the scheduler. */
    
    vTaskStartScheduler();
    
       for( ;; );
    
    }
    

    三.提交到github

    之前已经在Linux下安装了git并建立好了版本库,而且与github上的远程库关联好了,详细方法可见:
    https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013752340242354807e192f02a44359908df8a5643103a000

    将文件添加到版本库,并提交到仓库(我的文件名为Demo1)

    #git add Demo1
    # git commit -m"task"
    

    然后将把本地库的所有内容推送到远程库上:

    # git push -u origin master
    

    推送成功:GitHub链接为
    https://github.com/417739347/wgit/tree/master/Demo1

  • 相关阅读:
    典型用户及场景分析
    使用搜狗输入法个人感受
    第二期站立会议10
    寻找“水王”
    第二期站立会议9
    第二期站立会议8
    第二期站立会议7
    第二期站立会议6
    第二期站立会议5
    第二期站立会议4
  • 原文地址:https://www.cnblogs.com/xueyuanaichiyu/p/7607994.html
Copyright © 2020-2023  润新知