RTOS第二次作业

本文介绍了一个基于FreeRTOS的任务调度实例,包括开发环境搭建、QEMU安装与配置、任务调度程序编写及QEMU仿真调试过程。通过三个周期不同的任务实现数据发送、接收与监控,验证了任务间通信的有效性。
摘要由CSDN通过智能技术生成

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
  • 显示结果:
    1240387-20170930140842278-1683009935.png

2.编译例程

  • 在/Projects/Demo1目录下运行make,生成hello_rtos.elf文件
  • 生成文件:
    1240387-20170930141331403-2056533874.png

3.QEMU仿真

  • 在Demo1目录下运行脚本
    #./qemu.sh
  • 所得结果如图:
    1240387-20170930141011559-1353529256.png
    1240387-20170930141020090-1734949289.png

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显示动画。
    1240387-20170930141002903-2124046996.png

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( ;; );
}

结果图:

1240387-20170930141522262-576864818.png

github链接:

https://github.com/HUSTPJ/STM32F429_Discovery_FreeRTOS_9

转载于:https://www.cnblogs.com/hustj/p/7614765.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值