实时控制第二次作业

一.例程编译

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

posted on 2017-09-28 21:41  学远爱吃鱼  阅读(330)  评论(2编辑  收藏  举报

导航