实时控制第二次作业
一.例程编译
1.开发环境搭建
从老师github上git例程:
# mkdir work
# cd work
# git clone https://github.com/cbhust/STM32F429_Discovery_FreeRTOS_9.git
2.QEMU安装
下载二进制文件 gnuarmeclipse-qemu-debian64-2.8.0-201612271623-dev.tgz到~/work目录
在工作目录解压缩文件
#tar xvf gnuarmeclipse-qemu-debian64-2.8.0-201612271623-dev.tgz
#chmod -R -w ./qemu
为避免每次关闭ternimal都需要添加路径,在自己的home目录下修改 .bashrc文件,在其末尾添加
export PATH=~/work/qemu/2.8.0-201612271623-dev/bin/:$PATH
#ls -a | grep bash
#vi .bashrc
3.编译仿真
在/Projects/Demo1目录下运行make生成hello_rtos.elf文件
运行脚本文件
#cd ~/work/STM32F429_Discovery_FreeRTOS_9/Projects/Demo1
#make
#./qemu.sh
运行结果:
红灯每闪两次,绿灯闪一次。可能是VMware没设置好或者版本问题导致GUI无法显示,目前问题还没解决。
4.GDB调试
在/Projects/Demo1目录下运行qemu_gdb脚本文件
下载gbd:
#./qemu_gdb
#sudo apt-get install gdb-arm-none-eabi
发现报错如下:
网上搜索发现解决方法:
#sudo apt-get -o Dpkg: :Options: :="- -force-overwrite" install gdb-arm-none-eabi
在新打开的终端输入:
#arm-none-eabi-gdb
(gdb)target remote localhost:1234
(gdb)continue
qemu开始执行程序:
二.编写任务
1.基本思路
使用FreeRTOS的任务间通信和同步API和队列机制完成数据的收发,Sender_Task每2ms向队列发送一次数据并且将数据累加,将值存到Reciever_Task
每1000ms向队列收取一次数据,必须保证一次性将队列中所有数据全部收取,并将收取的数据累加,Monitor_Task每10000ms比较一次收发程序
的累加值是否相等,如果相等则绿灯亮1000ms表示正确接收, 否则红灯亮1000ms表示没有正确接收。
2.Sender_Task
void Sender_Task(void *pvParameters)
{
uint32_t SendNum=1;
while(1)
{
/*向队列中填充内容*/
xQueueSend(MsgQueue,(void* )&SendNum,0);
SendFlag=SendFlag+SendNum;
SendNum++;
if(SendNum==10000)
{
uint32_t SendNum=1;
}
vTaskDelay(2);
}
}
3.Reciever_Task
如果项目成功被队列接收返回pdTRUE ,否则返回 pdFALSE,如果返回pdTRUE则继续接收,设置延迟为0,一直到返回pdFALSE
则表示队列收取完毕,停止接收。
void Receiver_Task(void *pvParameters)
{
uint32_t ReceiverNum=0;
while(1)
{
/*向队列中获取内容*/
while(xQueueReceive(MsgQueue,&ReceiverNum,
0/portTICK_RATE_MS ) == pdTRUE )
{
ReceiverFlag=ReceiverFlag+ReceiverNum;
}
vTaskDelay(1000);
}
}
4.Monitor_Task
void Monitor_Task(void)
{
while(1)
{
/*接收成功绿灯亮 否则红灯亮*/
if(ReceiverFlag == SendFlag)
{
Green_LED_On();
vTaskDelay(1000);
Green_LED_Off();
}
else
{
Red_LED_On();
vTaskDelay(1000);
Red_LED_Off();
}
vTaskDelay(10000);
}
}
5.main()
int main(void)
{
/*建立队列*/
MsgQueue=xQueueCreate(30000,sizeof(uint32_t));
/*建立任务*/
xTaskCreate(
Sender_Task,
(signed portCHAR *)"Sender_Task",
configMINIMAL_STACK_SIZE,
(void*) NULL,
tskIDLE_PRIORITY+4UL,
NULL
);
xTaskCreate(
Receiver_Task,
(signed portCHAR *)"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
);
/* Start the scheduler. */
vTaskStartScheduler();
for( ;; );
}
三.提交到github
之前已经在Linux下安装了git并建立好了版本库,而且与github上的远程库关联好了,详细方法可见:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013752340242354807e192f02a44359908df8a5643103a000
将文件添加到版本库,并提交到仓库(我的文件名为Demo1)
#git add Demo1
# git commit -m"task"
然后将把本地库的所有内容推送到远程库上:
# git push -u origin master
推送成功:GitHub链接为
https://github.com/417739347/wgit/tree/master/Demo1