【WCH蓝牙系列芯片】-基于CH32V208开发板—TMOS系统说明(二)

-------------------------------------------------------------------------------------------------------------------------------------

利用TMOS自己建立一个自定义的任务事件例程:
先是建立一个"tmos_demo_task.c" 和 “tmos_demo_task.h”如下:

 

#include "tmos_demo_task.h"

//存储 当前task id 的全局变量
tmosTaskID  demo_task_id = INVALID_TASK_ID;


//系统消息处理的函数

//task的event处理回调函数,需要在注册task时候,传进去
static uint16_t demo_task_process_event( uint8_t task_id, uint16_t events )
{
    if ( events & SYS_EVENT_MSG ) //消息事件处理,接收数据事件
    {
        uint8_t *pMsg;
        if ( (pMsg = tmos_msg_receive( demo_task_id )) != NULL )  //接收数据
        {
            //We can’t get the length of the received message here,  //无法获得数据长度
            //Length information is required when using variable length messages  在使用可变长度消息时需要长度信息
            PRINT("-revice data-:");
            for(uint8_t i=0;i<8;i++)
            {
                PRINT("%02x ",pMsg[i]);
            }
            PRINT("\r\n");
            // Release the TMOS message   ////释放数据动态内存
            tmos_msg_deallocate( pMsg );
        }
        // return unprocessed events
        return (events ^ SYS_EVENT_MSG);   //返回未处理的事件,使用位异或操作符 ^ 将 SYS_EVENT_MSG 从 events 中移除。
    }

    //event1 处理
    if(events & DEMO_TASK_TMOS_EVT_TEST_1)
    {
        PRINT("****TMOS_EVT_TEST_1****\r\n");
        return (events ^ DEMO_TASK_TMOS_EVT_TEST_1);
    }

    //event2 处理
    if(events & DEMO_TASK_TMOS_EVT_TEST_2)
    {
        tmos_start_task(demo_task_id, DEMO_TASK_TMOS_EVT_TEST_3, 1600);   // 1600 = 1s
        PRINT("!!!!TMOS_EVT_TEST_2!!!!\r\n");
        return (events ^ DEMO_TASK_TMOS_EVT_TEST_2);
    }

    //event3 处理
    if(events & DEMO_TASK_TMOS_EVT_TEST_3)
    {
        tmos_start_task(demo_task_id, DEMO_TASK_TMOS_EVT_TEST_3, 1600);   // 1600 = 1s
        PRINT(">>>>TMOS_EVT_TEST_3<<<<\r\n");

        uint8_t test_data[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};

        PRINT("tmos send fixed length data test\r\n");   //发送固定长度
        tmos_demo_task_send_msg(demo_task_id, test_data, 8);  //发送数据任务事件
        return (events ^ DEMO_TASK_TMOS_EVT_TEST_3);
    }
    // Discard unknown events
    return 0;
}


//向指定任务发送数据
uint8_t tmos_demo_task_send_msg( uint8_t task_id, uint8_t *data , uint16_t length )
{
    uint8_t *p_data;
    if ( task_id != TASK_NO_TASK ) //判断是否存在有效的目标任务
    {
        // Send the address to the task
        p_data = tmos_msg_allocate(length); //申请内存放,数据长度

        if ( p_data )  //检查分配的消息缓冲区是否有效,即缓冲区地址是否非空。
        {
            tmos_memcpy(p_data, data, length);  //将 data 指针指向的数据拷贝到 p_data 指向的缓冲区中
            tmos_msg_send( task_id, p_data );  //向目标任务发送消息

            return ( SUCCESS );  //发送成功
        }
    }
    return ( FAILURE );  //发送失败
}


//初始化task
//包括注册函数,可以注册后去开启event
void demo_task_init( void )
{
    //注册task id,同时把该task的event处理函数传进去
    demo_task_id  = TMOS_ProcessEventRegister( demo_task_process_event );

    //立即开始一个event
    tmos_set_event(demo_task_id,DEMO_TASK_TMOS_EVT_TEST_1);

    //开始一个定时event,1s后产生,当前语句只会产生一次event
    //可以在event产生后去开启event,可以是别的task的,也可以是当前task的event
    tmos_start_task(demo_task_id,DEMO_TASK_TMOS_EVT_TEST_2,1600);
}

 

#ifndef INCLUDE_TMOS_DEMO_TASK_H_
#define INCLUDE_TMOS_DEMO_TASK_H_

#include <stdint.h>

#include "CONFIG.h"
#include "HAL.h"
#include "gattprofile.h"
#include "peripheral.h"

#define DEMO_TASK_TMOS_EVT_TEST_1   (0x0001<<0)
#define DEMO_TASK_TMOS_EVT_TEST_2   (0x0001<<1)
#define DEMO_TASK_TMOS_EVT_TEST_3   (0x0001<<2)
#define DEMO_TASK_TMOS_EVT_TEST_4   (0x0001<<3)
#define DEMO_TASK_TMOS_EVT_TEST_5   (0x0001<<4)

void demo_task_init(void);
uint8_t tmos_demo_task_send_msg( uint8_t task_id,uint8_t *data ,uint16_t length ) ;

#endif /* INCLUDE_TMOS_DEMO_TASK_H_ */

在tmos_demo_task.c中
1、先创建任务TakeID

2、定义不同的事件的标志

  3、注册任务事件

4、调用事件,先是立即执行DEMO_TASK_TMOS_EVT_TEST_1,然后经过1s后,再执行DEMO_TASK_TMOS_EVT_TEST_2事件。

5、再任务函数中,执行相对应的任务事件。
-消息事件

6、任务事件1和任务事件2,在任务事件2中又进行1s的TMOS任务事件,执行任务事件3

7、任务事件3,里面先是执行每1s打印一次,然后发送一组数据test_data,执行tmos_demo_task_send_msg发送数据任务事件

8、在tmos_demo_task_send_msg函数中,通过tmos_msg_send指定任务发送消息,并执行相应的回调事件和系统事件消息

9、因此在回调的任务函数中,处理这个消息事件,接收发送的数据,并打印出。

10、在主函数的while循环中调用demo_task_init(),通过串口打印可以看一下现象。

posted on 2024-01-10 10:24  凡仕  阅读(255)  评论(0编辑  收藏  举报