RTOS第二次作业

0.开发环境搭建

由于第一次作业做了部分工作,这次只做了下面步骤:

# sudo apt-get install gdb-arm-none-eabi
	# mkdir work
	# cd work
	# git clone https://github.com/cbhust/STM32F429_Discovery_FreeRTOS_9.git

1.QEMU安装

#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
  • 测试qemu能否正常运行
#qemu-system-gnuarmeclipse --version
  • 显示结果:

2.编译例程

  • 在/Projects/Demo1目录下运行make,生成hello_rtos.elf文件
  • 生成文件:

3.QEMU仿真

  • 在Demo1目录下运行脚本
#./qemu.sh
  • 所得结果如图:

4.GDB调试

  • 在/Projects/Demo1目录下运行qemu_gdb脚本文件,该文件中添加了--gdb tcp::1234 -S
    qemu启动后等待来自gdb的调试指令,打开另外一个终端窗口,运行
#arm-none-eabi-gdb
  • 在gdb界面内运行:
(gdb)target remote localhost:1234
(gdb)continue
  • 也可以看到程序运行,GUI显示动画。

5.编程

要求:

  • 创建三个任务:Sender_Task,Receiver_Task, Monitor_Task
  • Sender_Task的任务执行周期为2ms,Receiver_Task的任务执行周期为1000ms, Monitor_Task的任务执行周期为10000ms。
  • Sender_Task在每个执行周期向队列MsgQueue发送一个32位无符号整数,第一次发送1,然后依次发送2,3,4......,发送完10000后再从1开始发送。同时对发送的数据进行计算累加计算并保存当前累加结果。
  • Receiver_Task对接收到的数据进行和Sender_Task同样的累加计算并保存当前累加结果。
  • Monitor_Task在每个执行周期检查Sender_Task发送的每个数据是否都被Receiver_Task正确的接收和处理,在这里我通过比较Sender_Task和Receiver_Task的累加和是否相等来判断。

1.Sender_Task:

void Sender_Task(void *pvParameters)
{uint32_t  SendNum=1;
 while(1)
 {
  xQueueSend(MsgQueue,(void*)&SendNum,0);
  SendNumPlus=SendNumPlus+SendNum;
  SendNum++;
     if(SendNum>10000) 
            SendNum=1;
  vTaskDelay(2);
 }
}

2.Receiver_Task:

void Receiver_Task(void *pvParameters)
{uint32_t  ReceiveNum=0;
 for(;;)
  {while(xQueueReceive(MsgQueue,&ReceiveNum,100/portTICK_RATE_MS)==pdPASS)
      {RecNumPlus=RecNumPlus+ReceiveNum;
      }
    vTaskDelay(1000);
   }  
}

3.Monitor_Task:

void Monitor_Task(void *pvParameters)
{ while(1)
 {  if((RecNumPlus>0)&&(RecNumPlus==SendNumPlus))             /*判断发送、接收累加和是否相等;若相等,则成功接收,红灯亮*/
    { Red_LED_On();
      Green_LED_Off();
     vTaskDelay(10000);
     Red_LED_Off();
     Green_LED_On();
    }
  else 
     {Green_LED_On(); 
      vTaskDelay(10000);
      Green_LED_Off();
     }
  }
}

4.main函数:

uint32_t  SendNumPlus=0;          /*全局变量,发送数字累加和*/
uint32_t  RecNumPlus=0;                                 /*全局变量,接收数字累加和*/
int main(void)
{  Hardware_Init();
   vTraceEnable(TRC_INIT);
   vTraceEnable(TRC_START);
   MsgQueue=xQueueCreate(500,sizeof(uint32_t));    /*创建队列MsgQueue*/

/*创建三个任务*/
   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( ;; );
}

结果图:

github链接:

https://github.com/HUSTPJ/STM32F429_Discovery_FreeRTOS_9

posted @ 2017-09-30 14:28  HUSTJ  阅读(237)  评论(2编辑  收藏  举报