第二次作业要求

这次作业内容有些多,里面有很多陌生的东西,先梳理一下:

1.实现代码管理:

将例程项目Fork到自己的repository,同时在本地电脑安装git工具,创建云端本地的文件同步。

2.安装仿真软件:

安装好QEMU来模拟stm32f4评估板的运行,实现Demo1的仿真运行,(以此调高调试速度、节约调试成本)。

3.学习和实现FreeRTOS多任务同步和通信:

学习Demo1的闪灯例程,以此熟悉FreeRTOS的API接口和使用、熟悉main.c的代码结构;

编程实现如下要求:

  • 创建三个任务: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开始发送。同时对发送的数据进行计算累加计算并保存当前累加结果。
  • Receiver_Task对接收到的数据进行和Sender_Task同样的累加计算并保存当前累加结果。
  • Monitor_Task在每个执行周期检查Sender_Task发送的每个数据是否都被Receiver_Task正确的接收和处理,请自行设计一种检查机制并实现。
  • 可利用STM32F429I Discovery开发板的相关硬件(LED/LCD/串口)来输出相关状态信息。
  • 使用FreeRTOS的任务间通信和同步API完成上述功能。

 

作业过程:)

1.安装QEMU、编译Demo1、运行仿真。

https://github.com/wangsanhust/STM32F429_Discovery_FreeRTOS_9

期间:

直接向系统PATH变量文件里写入qemu路径:

sudo vim /etc/profile

最后一行添加如下内容保存,注销再登录即可,注意,我的qemu文件夹在~/RTCSD2017/work/路径下。

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

make后,运行qemu.sh,成功启动QEMU的GUI,红灯闪两次路灯闪一次的循环闪烁。

 

2.学习分析Demo1例程的main.c及涉及的RTOS API。

•分析main.c:

http://www.cnblogs.com/wangsan-hust/p/7615749.html

•学习RTOS API:

FreeRTOS使用指南 链接

•本例程里用到的函数:

vTraceEnable(TRC_INIT);      //Trace ???

vTraceEnable(TRC_START);

xTaskCreate(
          ToggleLED1_Task,                 /* Function pointer */
          "Task_LED1",                          /* Task name - for debugging only*/
          configMINIMAL_STACK_SIZE,         /* Stack depth in words */
          (void*) NULL,                     /* Pointer to tasks arguments (parameter) */
          tskIDLE_PRIORITY + 3UL,           /* Task priority*/
          NULL                              /* Task handle */
       );

vTaskStartScheduler();   //开启任务调度

vTaskDelay(1000 / portTICK_RATE_MS);   //延时1000ms

 

3.编程作业(主体)。

1.xTaskCreate()创建三个任务:Sender_Task,Receiver_Task, Monitor_Task ,发送、接受、监视(LED指示)优先级分别为4、3、2。

2.ToggleSender_Task()等创建三个任务的触发函数,分别用vTaskDelay()延时2ms、1000ms、10000ms。

3.队列(FIFO)实现任务间通信,相关API:

#include "queue.h"   //包含必须头文件

xQueueHandle NumQueue;   //全局创建队列句柄为 NumQueue

NumQueue = xQueueCreate( 1000 , 4);   //1000个项目数,每个项目4个字节

xQueueSend(NumQueue,&SecdNum,0);      //队列名,被发送数据的指针,队列满了,等待队列有空的最大时间

xQueueReceive(NumQueue,&ReceiveNum,0);   //队列名,接收数据的指针,队列空了,等待队列有数据的最大时间

4.监测机制:创建两个全局变量(可以通过使用计数型信号量改进),S1记录Sender_Task发送的数据次数,R2记录Receiver_Task接收的数据次数,Monitor_Task中对S1和R2进行比较,相等,红灯关,不相等,红灯亮,比较后S1、R2清零(初步思路,可优化)。绿灯闪烁denote正在接收。

 

代码链接:https://github.com/wangsanhust/STM32F429_Discovery_FreeRTOS_9/blob/Work2/Projects/Demo1/main.c

运行结果:

     

绿灯闪烁,表示接收正常;

红灯长亮,监测机制的逻辑不正确,有待优化。

 

4.上传到Github

在我的项目STM32F429_Discovery_FreeRTOS_9 下,branch一个测试版本分支:Work2

链接:https://github.com/wangsanhust/STM32F429_Discovery_FreeRTOS_9/tree/Work2

posted on 2017-09-30 18:20  王三hust  阅读(210)  评论(3编辑  收藏  举报