一、例程编译
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