代码改变世界

第二次作业

2017-09-29 16:58  Harry369  阅读(176)  评论(1编辑  收藏  举报

一、例程编译
1、开发环境搭建
从老师github上git例程:

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

2、QEMU安装
到网页 https://github.com/gnu-mcu-eclipse/qemu/releases/tag/gae-2.8.0-20161227 下载二进制文件 gnuarmeclipse-qemu-debian64-2.8.0-201612271623-dev.tgz到~/work目录
在工作目录解压缩文件,并把路径添加到$PATH变量中

    #cd ~/work 
    #tar xvf gnuarmeclipse-qemu-debian64-2.8.0-201612271623-dev.tgz  
    #chmod -R -w ./qemu  
    export PATH=~/work/qemu/2.8.0-201612271623-dev/bin/:$PATH

为避免每次开机设置,在.bashrc文件末尾添加

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

3、QEMU仿真
在Demo1目录下运行脚本文件:
#./qemu.sh
则qemu开始执行hello_rtos.elf文件,在弹出的GUI中看到程序执行的效果

4、GDB调试
在/Projects/Demo1目录下运行qemu_gdb脚本文件,该文件中添加了--gdb tcp::1234 -S
qemu启动后等待来自gdb的调试指令

打开另外一个终端窗口,运行
#arm-none-eabi-gdb
在gdb界面内运行:

    (gdb)target remote localhost:1234
     (gdb)continue

可以看到qemu开始执行程序,GUI界面上可以看到程序执行效果。

二、编程作业
1、基本要求
创建三个任务:Sender_Task,Receiver_Task, Monitor_Task
Sender_Task的任务执行周期为2ms,Receiver_Task的任务执行周期为1000ms, Monitor_Task的任务执行周期为10000ms。
Sender_Task在每个执行周期向Receiver_Task发送一个32位无符号整数,第一次发送1,然后依次发送2,3,4......,发送完10000后再从1开始发送。同时对发送的数据进行计算累加计算并保存当前累加结果
2、具体步骤
学习并查阅相关资料,并且参考前面同学的博客,最终还是编译有许多无法解决的错误

3、main函数

    int main(void)
{
     MsgQueue=xQueueCreate(30000,sizeof(uint32_t));
   xTaskCreate(
                Sender_Task,
                "Sender_Task",
                configMINIMAL_STACK_SIZE,
                (void*) NULL,
                tskIDLE_PRIORITY+4UL,
                NULL
               );
     xTaskCreate(
                Receiver_Task,
                "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
               );
vTaskStartScheduler();
for( ;; );

}``

4、Sender_Task

    void Sender_Task(void *pvParameters)
    {
             uint32_t Sendnum=1;

             while(1)
             {
                     xQueueSend(MsgQueue,(void* )&Sendnum,0);
                     Sendsum=Sendsum+Sendnum;
                     Sendnum++;
                     if(Sendnum==10000)
                     {
                        uint32_t Sendnum=1;
                     }
                     vTaskDelay(2);
             }       
    }

5、Receiver_Task

    void Receiver_Task(void *pvParameters)
    {
             uint32_t Receivernum=0;

             while(1)
             {
                     while(xQueueReceive(MsgQueue,&Receivernum,
                     0/portTICK_RATE_MS) == pdTRUE)
                     {
                      Receiversum=Receiversum+Receivernum;
                     }
                     vTaskDelay(1000);
             }       
    }

6、Monitor_Task

   void  Monitor_Task(void)
    {
           while(1)
           {
             if(Receiversum == Sendsum)
             {
              Green_LED_On();
              vTaskDelay(1000/ portTICK_RATE_MS);
              Green_LED_Off();
             }
             else
             {
              Red_LED_On();
              vTaskDelay(1000/ portTICK_RATE_MS);
              Red_LED_Off();
             }
             vTaskDelay(10000);
           }
    }

附github地址:https://github.com/ZYM2017/STM32F429_Discovery_FreeRTOS_9/tree/master/Projects/task2