1.创建工程
分配任务栈大小,可以设置大一点,内存不足会导致任务无法创建
2.任务
2.1CUBEMX添加任务
2.1新建任务函数文件
(1)新建 app.h,和app.c文件。添加进工程。
(2)将通过虚函数方式生成的任务函数重写
所有的任务函数都必须要有死循环保证任务运行,以及延时函数。
3.信号量
3.1信号量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.2事件标志组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.2软件定时器API
6.4软件定时器应用举例
(1)软件定时器循环发送串口数据
osTimerStart(VerifyTimerHandle, 500); // 启动软件定时器
void InstructTimerCallback(void *argument)
{
/* 软件定时器执行 */
}
osTimerStop(VerifyTimerHandle, 500); // 关闭软件定时器