[STM32F1] 通过TINIUX轻量级同步消息控制LED灯_STM32F103ZET6

[复制链接]
1146|5
 楼主| yoofs 发表于 2018-3-14 22:55 | 显示全部楼层 |阅读模式
通过TINIUX轻量级同步消息控制LED灯

创建两个任务,一个为LedTask任务,一个为CtrlTask任务,两个任务之间通过轻量级同步消息进行同步交互操作,Led灯状态的变换由同步消息的数值决定。此例程主要演示了TINIUX系统中接口函数OSTaskSignalWaitMsg()OSTaskSignalEmitMsg()的使用方式。

相关实现代码如下所示:



  1. // 包含芯片相关的头文件。
  2. #include "stm32f1xx_hal.h"
  3. #include "config.h"
  4. // 包含嵌入式实时操作系统TINIUX相关的头文件TINIUX.h,在使用TINIUX操作系统时,必须包含此头文件。
  5. #include "TINIUX.h"

  6. // 定义空指针
  7. #ifndef NULL
  8.   #define    NULL            ( OS_NULL )
  9. #endif

  10. // 定义LED任务的句柄,便于对LED任务的具体操作
  11. OSTaskHandle_t LedTaskHandle    = NULL;
  12. // 定义控制任务的句柄,与LED任务通过轻量级同步消息进行同步交互操作
  13. OSTaskHandle_t CtrlTaskHandle   = NULL;

  14. // LED任务函数的声明
  15. static void LedTask( void *pvParameters );
  16. // Ctrl控制任务函数的声明
  17. static void CtrlTask( void *pvParameters );

  18. // LED任务的具体实现函数
  19. static void LedTask( void *pvParameters )
  20. {
  21.     sOSBase_t xSigValue = 0U;

  22.     // 我们暂时没有用到任务函数的参数pvParameters
  23.     ( void )pvParameters;

  24.     // 任务函数体内一般都是一个死循环,不能通过return语句返回,若任务函数执行完毕后没有必要再继续执行,
  25.     // 则需要调用OSTaskDelete函数进行任务删除操作,便于系统调度,同时把分配给该任务的堆栈空间回收,以供系统再次使用。
  26.     for( ;; )
  27.     {
  28.         // 调用TINIUX的接口函数,让此任务等待接收轻量级的同步消息,等待时间为OSPEND_FOREVER_VALUE,此数值代表永久等待,直至接收到有效的消息为止。
  29.         // 也可以通过参数指定一个具体的数值,代表等待具体的时间,单位为Ticks。若在指定的时间内没有接收到有效消息,则也返回,只是返回值为OS_FALSE;
  30.         // 若在指定的等待时间内接收到有效的消息后,则返回OS_TRUE。此函数与CtrlTask任务中的OSTaskSignalEmitMsg函数相对应。
  31.         OSTaskSignalWaitMsg( &xSigValue, OSPEND_FOREVER_VALUE);

  32.         // 接收到消息后,根据消息的数值,转换LED灯的状态
  33.         // 控制LED等的亮或熄灭,请参照你的板卡进行控制实验。
  34.         if( (xSigValue&0x1) == 0U)
  35.         {
  36.             HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_PIN, GPIO_PIN_RESET);
  37.         }
  38.         else
  39.         {
  40.             HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_PIN, GPIO_PIN_SET);
  41.         }
  42.     }
  43. }

  44. // 控制任务的具体实现函数
  45. static void CtrlTask( void *pvParameters )
  46. {
  47.     sOSBase_t xSigValue = 0U;

  48.     // 我们暂时没有用到任务函数的参数pvParameters
  49.     ( void )pvParameters;

  50.     // 任务函数体内一般都是一个死循环,不能通过return语句返回。
  51.     for( ;; )
  52.     {
  53.         // 调用TINIUX的接口函数,让此任务休眠500毫秒,这里调用OSM2T函数,
  54.         // 将500毫秒数值转换为OSTaskSleep函数需要的Ticks数值
  55.         OSTaskSleep( OSM2T(500) );

  56.         //通过任务句柄LedTaskHandle,向LedTask任务发射同步消息。此接口函数与LedTask任务中的OSTaskSignalWaitMsg函数相对应;
  57.         OSTaskSignalEmitMsg(LedTaskHandle, xSigValue, OS_FALSE);
  58.         //发送完同步消息后,变更消息的数值
  59.         xSigValue ^= 1;
  60.     }
  61. }

  62. int main(void)
  63. {
  64.     // 对硬件进行配置,包括时钟及Led等.
  65.     SetupHardware();
  66.     GPIO_Configuration();

  67.     // 在使用TINIUX之前,首先对TINIUX相关参数进行初始化
  68.     OSInit();

  69.     // 创建控制LED灯的任务,第一个参数指定具体的任务函数LedTask,第二个参数为LedTask用到的参数,此处我们暂时不用,填写NULL
  70.     // 第三个参数为任务使用的堆栈空间,因为LedTask任务函数中使用的变量较少,我们直接填写OSMINIMAL_STACK_SIZE,
  71.     // 第四个参数填写为LedTask任务分配的优先级,在此例程中,我们使用的任务不多,此处填写比空闲任务大1个的优先级,
  72.     // 第五个参数为任务的名称,任务的名称主要便于调试时分辨任务,此处我们根据任务的功能填写Led
  73.     // 任务创建完毕后,返回任务句柄,保存到LedTaskHandle中,便于后面对此任务进行操作
  74.     LedTaskHandle     = OSTaskCreate(LedTask, NULL, OSMINIMAL_STACK_SIZE, OSLOWEAST_PRIORITY+1, "Led");
  75.     // 创建控制任务,参数含义参照main函数中创建LedTask任务时的注释,优先级与LedTask相同,也是OSLOWEAST_PRIORITY+1;
  76.     CtrlTaskHandle    = OSTaskCreate(CtrlTask, NULL, OSMINIMAL_STACK_SIZE, OSLOWEAST_PRIORITY+1, "Ctrl");

  77.     // 启动TINIUX操作系统
  78.     OSStart();

  79.     // 如果TINIUX启动正常,则不会执行到这里。
  80.     // 一旦运行到此处,有可能是分配给TINIUX的堆栈空间太小,TINIUX直接退出运行了。
  81.     for( ;; );
  82. }


通过TINIUX轻量级同步消息控制LED灯_STM32F103ZET6.rar (1.53 MB, 下载次数: 4)

lzmm 发表于 2018-3-21 10:02 来自手机 | 显示全部楼层
TINIUX操作系统是新系统吗
小灵通2018 发表于 2018-3-21 10:05 | 显示全部楼层
这个系统目测要火。
mmuuss586 发表于 2018-3-22 11:22 | 显示全部楼层
感谢分享;
newphj 发表于 2018-3-22 15:34 | 显示全部楼层
huangcunxiake 发表于 2018-3-22 18:29 | 显示全部楼层
漂亮,这个OS貌似要比华为的火。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部