这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STML053-FREERTOS

共6条 1/1 1 跳转至

STML053-FREERTOS

菜鸟
2015-11-15 20:35:53     打赏

注:因工作原因不定时跳票,因能力原因请大家不要做过多期待。


在收到一块STM32L053的板子后,MDK和ST同时都走向了代码生成器这种,尤其都支持了一款RTOS-FREERTOS的自动生成,作为RTOS的未毕业生,这次正好借这个机会,重新复习一下RTOS的使用。
首先从STMCU上下载STM32L053的固件库,然后将它放在CUBEMX的库目录下(不准备使用cubemx的同学可以忽略此步),然后打开目录。
截图截毁了,我们继续打开。
打开后
第一个applications里是一些应用级别的例程,包括FATFS,FREERTOS,以及USB,我们打开FREERTOS这个文件夹 我们可以打开low power这个文件夹,打开例程,编译并下载。

在介绍里我们可以看到,例程创建了两个线程,一个用来接受,一个用来发送。 接受线程等待数据并阻塞队列,发送线程每500ms进入一次阻塞状态。在退出阻塞状态后发送一个数值,接受状态等待这个数值并闪烁led。 而在有限的阻塞状态中,允许内核停止滴答定时器并进入睡眠模式,在最低的低功耗模式下仍然允许CPU保持ram状态(表示不信)
在这个例程中,CPU将无用的io引脚配置成了模拟模式,这有利于降低功耗。 readme中说明CPU每500ms退出一次低功耗模式,然后打开led,然后进入低功耗模式,20ms后退出低功耗模式并关闭led。


然后我们来看看代码。 //启动hal HAL_Init();
//配置时钟 /* Configure the System clock to 2 MHz */ SystemClock_Config();
//将无用IO引脚配置为模拟模式 /* Configure GPIO's to AN to reduce power consumption */ GPIO_ConfigAN();
//配置LED引脚 /* Initialize LED */ BSP_LED_Init(LED2);
//以下是FREERTOS核心代码 //创建一个消息队列
/* Create the queue used by the two threads */ osMessageQDef(osqueue, QUEUE_LENGTH, uint16_t); osQueue = osMessageCreate(osMessageQ(osqueue), NULL);
//创建两个线程 /* Note the Tx has a lower priority than the Rx when the threads are spawned. */ //第一个参数为线程名,第二个为线程要执行的函数,第三个是优先级 osThreadDef(RxThread, QueueReceiveThread, osPriorityNormal, 0, configMINIMAL_STACK_SIZE); osThreadCreate(osThread(RxThread), NULL);
osThreadDef(TxThread, QueueSendThread, osPriorityBelowNormal, 0, configMINIMAL_STACK_SIZE); osThreadCreate(osThread(TxThread), NULL);
//启动内核 /* Start scheduler */ osKernelStart();

接着我们来看下发送线程要执行的函数
static void QueueSendThread(const void *argument) {


for (;;)

{


/* Place this thread into the blocked state until it is time to run again.

The kernel will place the MCU into the Retention low power sleep state when the idle thread next runs. */


osDelay(TX_DELAY);


/* Send to the queue - causing the queue receive thread to flash its LED.

It should not be necessary to block on the queue send because the Rx

thread will already have removed the last queued item. */


osMessagePut(osQueue, (uint32_t)QUEUED_VALUE, 0);

} }
我们可以看到,发送线程只是延时500ms然后发送一个数据到消息队列
而接收线程执行的函数


static void QueueReceiveThread(const void *argument)

{


osEvent event;


for (;;) { /* Wait until something arrives in the queue. */


event = osMessageGet(osQueue, osWaitForever);


/*  To get here something must have arrived, but is it the expected value?  If it is, turn the LED on for a short while. */


if (event.status == osEventMessage)

{ if (event.value.v == QUEUED_VALUE) { BSP_LED_On(LED2); osDelay(LED_TOGGLE_DELAY); BSP_LED_Off(LED2); } } } } 在这个函数里,创建一个事件,并在超时后检测队列是否接收到数据并处理
底下是关于低功耗的配置,此处不做过多接受(楼主还没看过hal库的低功耗,原来用过标准库),关于低功耗函数的开启也在底下的函数里调用。




菜鸟
2015-11-15 20:40:40     打赏
2楼
图片不知道为毛传不上去,明早再试试

菜鸟
2015-11-15 21:01:10     打赏
3楼
文章用有道云笔记写然后复制过来的,格式有点乱,把云笔记生成的PDF文档一起上传了初试FREERTOS.pdf

院士
2015-11-15 21:13:48     打赏
4楼
这个例程的封装基本与freeRTOS无关了

专家
2015-11-16 10:47:50     打赏
5楼
进来学习

菜鸟
2015-11-16 18:38:28     打赏
6楼

学习


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]