第二次作业要求
这次作业内容有些多,里面有很多陌生的东西,先梳理一下:
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