通过TINIUX轻量级同步消息控制LED灯
创建两个任务,一个为LedTask任务,一个为CtrlTask任务,两个任务之间通过轻量级同步消息进行同步交互操作,Led灯状态的变换由同步消息的数值决定。此例程主要演示了TINIUX系统中接口函数OSTaskSignalWaitMsg()与OSTaskSignalEmitMsg()的使用方式。
相关实现代码如下所示:
// 包含芯片相关的头文件。
#include "stm32f1xx_hal.h"
#include "config.h"
// 包含嵌入式实时操作系统TINIUX相关的头文件TINIUX.h,在使用TINIUX操作系统时,必须包含此头文件。
#include "TINIUX.h"
// 定义空指针
#ifndef NULL
#define NULL ( OS_NULL )
#endif
// 定义LED任务的句柄,便于对LED任务的具体操作
OSTaskHandle_t LedTaskHandle = NULL;
// 定义控制任务的句柄,与LED任务通过轻量级同步消息进行同步交互操作
OSTaskHandle_t CtrlTaskHandle = NULL;
// LED任务函数的声明
static void LedTask( void *pvParameters );
// Ctrl控制任务函数的声明
static void CtrlTask( void *pvParameters );
// LED任务的具体实现函数
static void LedTask( void *pvParameters )
{
sOSBase_t xSigValue = 0U;
// 我们暂时没有用到任务函数的参数pvParameters
( void )pvParameters;
// 任务函数体内一般都是一个死循环,不能通过return语句返回,若任务函数执行完毕后没有必要再继续执行,
// 则需要调用OSTaskDelete函数进行任务删除操作,便于系统调度,同时把分配给该任务的堆栈空间回收,以供系统再次使用。
for( ;; )
{
// 调用TINIUX的接口函数,让此任务等待接收轻量级的同步消息,等待时间为OSPEND_FOREVER_VALUE,此数值代表永久等待,直至接收到有效的消息为止。
// 也可以通过参数指定一个具体的数值,代表等待具体的时间,单位为Ticks。若在指定的时间内没有接收到有效消息,则也返回,只是返回值为OS_FALSE;
// 若在指定的等待时间内接收到有效的消息后,则返回OS_TRUE。此函数与CtrlTask任务中的OSTaskSignalEmitMsg函数相对应。
OSTaskSignalWaitMsg( &xSigValue, OSPEND_FOREVER_VALUE);
// 接收到消息后,根据消息的数值,转换LED灯的状态
// 控制LED等的亮或熄灭,请参照你的板卡进行控制实验。
if( (xSigValue&0x1) == 0U)
{
HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_PIN, GPIO_PIN_RESET);
}
else
{
HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_PIN, GPIO_PIN_SET);
}
}
}
// 控制任务的具体实现函数
static void CtrlTask( void *pvParameters )
{
sOSBase_t xSigValue = 0U;
// 我们暂时没有用到任务函数的参数pvParameters
( void )pvParameters;
// 任务函数体内一般都是一个死循环,不能通过return语句返回。
for( ;; )
{
// 调用TINIUX的接口函数,让此任务休眠500毫秒,这里调用OSM2T函数,
// 将500毫秒数值转换为OSTaskSleep函数需要的Ticks数值
OSTaskSleep( OSM2T(500) );
//通过任务句柄LedTaskHandle,向LedTask任务发射同步消息。此接口函数与LedTask任务中的OSTaskSignalWaitMsg函数相对应;
OSTaskSignalEmitMsg(LedTaskHandle, xSigValue, OS_FALSE);
//发送完同步消息后,变更消息的数值
xSigValue ^= 1;
}
}
int main(void)
{
// 对硬件进行配置,包括时钟及Led等.
SetupHardware();
GPIO_Configuration();
// 在使用TINIUX之前,首先对TINIUX相关参数进行初始化
OSInit();
// 创建控制LED灯的任务,第一个参数指定具体的任务函数LedTask,第二个参数为LedTask用到的参数,此处我们暂时不用,填写NULL
// 第三个参数为任务使用的堆栈空间,因为LedTask任务函数中使用的变量较少,我们直接填写OSMINIMAL_STACK_SIZE,
// 第四个参数填写为LedTask任务分配的优先级,在此例程中,我们使用的任务不多,此处填写比空闲任务大1个的优先级,
// 第五个参数为任务的名称,任务的名称主要便于调试时分辨任务,此处我们根据任务的功能填写Led
// 任务创建完毕后,返回任务句柄,保存到LedTaskHandle中,便于后面对此任务进行操作
LedTaskHandle = OSTaskCreate(LedTask, NULL, OSMINIMAL_STACK_SIZE, OSLOWEAST_PRIORITY+1, "Led");
// 创建控制任务,参数含义参照main函数中创建LedTask任务时的注释,优先级与LedTask相同,也是OSLOWEAST_PRIORITY+1;
CtrlTaskHandle = OSTaskCreate(CtrlTask, NULL, OSMINIMAL_STACK_SIZE, OSLOWEAST_PRIORITY+1, "Ctrl");
// 启动TINIUX操作系统
OSStart();
// 如果TINIUX启动正常,则不会执行到这里。
// 一旦运行到此处,有可能是分配给TINIUX的堆栈空间太小,TINIUX直接退出运行了。
for( ;; );
}
通过TINIUX轻量级同步消息控制LED灯_STM32F103ZET6.rar
(1.53 MB)
|