打印
[STM32F1]

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

[复制链接]
808|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yoofs|  楼主 | 2018-3-14 22:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过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)

沙发
lzmm| | 2018-3-21 10:02 | 只看该作者
TINIUX操作系统是新系统吗

使用特权

评论回复
板凳
小灵通2018| | 2018-3-21 10:05 | 只看该作者
这个系统目测要火。

使用特权

评论回复
地板
mmuuss586| | 2018-3-22 11:22 | 只看该作者
感谢分享;

使用特权

评论回复
5
newphj| | 2018-3-22 15:34 | 只看该作者
AIOS?

使用特权

评论回复
6
huangcunxiake| | 2018-3-22 18:29 | 只看该作者
漂亮,这个OS貌似要比华为的火。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

5

帖子

0

粉丝