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安装
- 到网站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.编译例程
- 在/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( ;; );
}