Bootstrap

CUBEMX中FreeRTOS的应用

1.创建工程

选择外部时钟源
标FreeRTOS会占用 SysTick,所以需要为其他总线提供另外的时钟源题

使用FreeRTOS,选择CMSIS_V2版本

FreeRTOS视图

 分配任务栈大小,可以设置大一点,内存不足会导致任务无法创建

分配任务栈大小

2.任务

2.1CUBEMX添加任务

任务视图
为任务配置参数

2.1新建任务函数文件

(1)新建 app.h,和app.c文件。添加进工程。

添加app.c文件到工程

添加app.h文件所在路径到工程

(2)将通过虚函数方式生成的任务函数重写

CUBEMX使用虚函数方式生成的任务函数​​​​​

所有的任务函数都必须要有死循环保证任务运行,以及延时函数。

3.信号量

3.1信号量API

信号量API视图

 3.2二值信号量

3.2.1CUBEMX添加二值信号量

二值信号量视图
添加二值信号量视图

3.1.2二值信号量应用举例

(1)串口接收中断释放二值信号量,任务等待获取信号量

extern osSemaphoreId_t Usart1BinaryHandle; // 引用信号量句柄

/* 串口空闲接收中断 */
void USAR_UART_IDLECallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
        /*  串口接收完成,释放信号量 */
	osSemaphoreRelease(Usart1BinaryHandle);
    }
}

/* 串口接收任务 */
void HmiUsartFunction(void *argument)
{
  osStatus_t xReturn;
  for(;;)
 {
    xReturn = osSemaphoreAcquire(Usart1BinaryHandle, 100); // 获取二值信号量
    if(xReturn == osOK)
    {
      /* 串口接收数据处理 */
    }
 }
}

4.队列

4.1CUBEMX添加队列

队列视图
添加队列视图

4.2队列API

队列操作宏

 4.3队列应用举例

(1)长度为1的队列进行覆写和读取

uint16_t RetQueue;


xQueueOverwrite(RobotArmDataHandle, &RetQueue); // 解析出来的数据入队,覆写

xQueueReceive(RobotArmDataHandle, &RetQueue, 0); // 读取队列数据

5.事件标志组

5.1CUBEMX添加事件标志组

5.1事件标志组视图
5.2添加事件标志组视图

5.2事件标志组API

5.3事件标志组API

5.3事件标志组应用举例

(1)事件标志组的每一位代表一个设备

/* 枚举设备 */
enum HmiState
{
	AirCylinder, 				// 气缸
	SuctionCup, 				// 吸盘
	QuickReleaseDisc, 	// 快拆盘
	PushCylinder, 			// 推料气缸
	DraughtFan, 				// 风机
	TemperatureControl, // 温控
	Fan, 								// 风扇
	Electromagnet, 			// 电磁铁
	VibratingDisk 			// 振动盘
};

/* 设备事件标志 */
#define AirCylinderEvent 				(1 << AirCylinder)
#define SuctionCupEvent 				(1 << SuctionCup)
#define QuickReleaseDiscEvent 	(1 << QuickReleaseDisc)
#define PushCylinderEvent 			(1 << PushCylinder)
#define DraughtFanEvent 				(1 << DraughtFan)
#define TemperatureControlEvent (1 << TemperatureControl)
#define FanEvent 								(1 << Fan)
#define ElectromagnetEvent 			(1 << Electromagnet)
#define VibratingDiskEvent 			(1 << VibratingDisk)


/* 反转事件标志组的某一位 */
void EventFlagToggle(osEventFlagsId_t ef_id, uint32_t flags)
{
	uint32_t EventRetToggle; // 事件标志组
	uint32_t flag;
	
	EventRetToggle = osEventFlagsGet(ef_id);
	
	flag = EventRetToggle & flags;
	
	if(flag)
	{
		osEventFlagsClear(ef_id, flags);
	}
	else
	{
		osEventFlagsSet(ef_id, flags);
	}
}

/* 设置事件标志组的某一位位1 */
osEventFlagsSet(EquipmentGroupHandle, AirCylinderEvent);

/* 获取事件标志组 */
uint32_t EventRet;
EventRet = osEventFlagsGet(RobotArmEventGroupHandle);
if(EventRet & TakeMaterialsEvent) // 校验TakeMaterialsEvent事件位
{
    /* TakeMaterialsEvent事件位为1时执行 */
}
else
{
     /* TakeMaterialsEvent事件位为0时执行 */
}

6.软件定时器

6.1CUBEMX添加软件定时器

6.1内核参数中使能软件定时器

6.2软件定时器视图

6.3软件定时器配置

6.2软件定时器API

6.4软件定时器API

6.4软件定时器应用举例

(1)软件定时器循环发送串口数据

osTimerStart(VerifyTimerHandle, 500); // 启动软件定时器

void InstructTimerCallback(void *argument)
{
	/* 软件定时器执行 */
}

osTimerStop(VerifyTimerHandle, 500); // 关闭软件定时器

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;