一、例程编译、测试
1.在github上,Fork例程项目(https://github.com/cbhust/STM32F429_Discovery_FreeRTOS_9.git) 到自己的个人账号。
2.clone项目到本地电脑的Ubuntu虚拟机中。
# sudo apt-get update
# sudo apt-get upgrade # sudo apt-get install build-essential git
# sudo apt-get install gcc-arm-none-eabi gdb-arm-none-eabi
# mkdir work # cd work # git clone https://github.com/cbhust/STM32F429_Discovery_FreeRTOS_9.git
3.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
测试qemu能否正常运行
#qemu-system-gnuarmeclipse --version
版本为2.8.0 符合要求
4.编译例程
在/Projects/Demo1目录下运行make,生成hello_rtos.elf文件
5.QEMU仿真
在Demo1目录下运行脚本文件:
#./qemu.sh
则qemu开始执行hello_rtos.elf文件,在弹出的GUI中看到程序执行的效果.
6.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.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( ;; );
3.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);
}
}
4.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);
}
}
5.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);
}
}