Peripheral_TaskID使用问题

就是这个Peripheral_TaskID我看不明白如下


image.png

在这个函数中,我的理解是给你自己定义的任务分配一个id,用来表示优先级把,前边的老大哥都排好顺序了,现在开始给你自己的任务编个号,但是我不知道这个号具体有啥用,


然后

image.png


在这个函数中有好多这个id,但是这个id也不是函数传进来的id,很明显这是个全局变量,然后我想要找这个TaskID是在哪里改变他的值的,就是在死循环里边那个地方改变他的值,从而分别出来要执行哪个事件,后来我发现死循环函数TMOS_SystemProcess()打不开,然后我就想起来我之前用的Zigbee协议栈,感觉跟这个蓝牙协议栈一样相似,然后就去看了Zigbee协议栈



image.png

相对应的大概就是这个函数了,他是跟距任务id从零开始依次递加,然后判断这个任务有没有被置1,置1的话说明这个事件被触发了,需要处理这个事件了,


image.png


我们不妨直接移动到这个触发的事件里


image.png

发现他确实是根据id找的任务,而这个图中的SampleApp_ProcessEvent这个函数对应的也是蓝牙协议中的Peripheral_ProcessEvent函数,但是这个时候我就有个疑问,如果在Peripheral_ProcessEvent函数里边我们自己定义不止一个事件,每个事件都分配一个id,那么这个id的值肯定比上边这个图里边的taskArr数组里边定义的这些个数大,也就是说超出了这个数组的范围,


越说越乱了,反正我就是不懂Peripheral_TaskID

image.png

这个函数里边明明每个事件ID不同,他还要写ID,还有就是既然有每个事件定义的下边这个东西,为啥还要id,直接按顺序写那个初始化的函数不就行了,俺不理解

image.png


求大佬指点




您好,taskID可以用来将一组事件归类。比如说您举例的Peripheral_TaskID,可以将BLE从机相关的逻辑都放到这个taskID下,由自定的事件宏来标识;这个taskID一般是static修饰的,作用域只在其定义的源文件中,这样条理更清晰。Peripheral_TaskID与初始化中注册的事件处理函数Peripheral_ProcessEvent绑定,安排事件后会进相应的事件处理函数,根据事件宏SBP_XXXX_EVT进if分支来执行逻辑。


那我能不能一个Peripheral_TaskID绑定好几个事件比如这样

image.png



可以的。用tmos_start_task()函数安排TMOS事件,其中第一个参数,是选择安排哪个taskID,例子中的Peripheral_TaskID绑定了Peripheral_ProcessEvent()函数,这样协议栈会自动安排跳转到这个函数中;其中第二个参数,比如说例子中的事件宏SBP_XXXX_EVT,就是用来给查询执行到Peripheral_ProcessEvent()中,具体应该执行哪些逻辑的,Peripheral_ProcessEventif判断语句写在越前面,优先级越高。

每个taskID下最多自定义15个事件,协议栈保留最高位事件编号即0x8000用来在不同taskID间传递数据。


呜呜呜呜呜呜呜呜呜呜,我终于看懂了,原来

image.png

这句话是绑定到这个函数里边呀,三克油,这好像就说的通了


我的问题又来了

image.png

就是这里边这个函数名是不是还可以改成我自己自定义的函数,然后我自己写一个函数,在里边也写一点if判断事件的东西,他这个在死循环里边也可以进入到我自定义的函数里边吗?



然后还有就是

image.png

这些判断语句的对应事件,好像都没有明确表明他们绑定到Peripheral_ProcessEvent这个函数里边去了

并不像


image.pngimage.png

这个函数那么明显


与taskID绑定的函数是可以自定义的,改个其他名字都行。添加事务处理代码的操作可以参考下篇博客

在TMOS系统的main.c中添加事务处理代码 - JayWell - 博客园 (cnblogs.com)

规定事件的宏可以理解成一个序号,按if分支编写的前后顺序查询进了事件处理函数后具体执行哪些逻辑,没有一对多的绑定关系,其他taskID也可以在对应的事件处理函数中使用。


哦哦原来如此,三克油



只有登录才能回复,可以选择微信账号登录