通过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, 下载次数: 4)
|