注册机制在嵌入式编程中很少说到,但回调函数咱们常常触摸,以软件定时器为例:
软件定时器设备经过函数Start把FunctionCallback作为参数传入定时器设备中保存,之后敞开定时器,延时1000ms之后,定时器就会直接调用FunctionCallback,所以这个FunctionCallback就叫做回调函数。相似处理器的中止相同。
注册机制相似回调函数性质,仅仅把概念扩展到变量,上层使用经过注册函数地址或许变量地址到设备中保存,当设备中这个地址对应的函数被激活或许变量值有改动,就调用这个函数或许更改这个变量值,以此到达底层对上层的信息传递。
以ADC设备为例,咱们看一下注册机制的使用。首先在ADC设备device_adc.c中界说一个用于注册变量地址的指针数组RegisterPointerBlock,初始值必需求指向一个空变量,不然若指向了一些有用的地址而导致这个地址对应的数据改动,会引起不行猜测问题。
在设备中引进注册机制,使用层只需求把变量的地址注册到设备中,设备自己能够经过这个地址修正数据,这样解放了使用层,让使用层不需求关怀怎么获取数据。可是,注册机制也存在一些缺点,那就是操作的数据,必需求原子操作,不然会导致两个使用层与设备一起修正一个数据的反常存在,呈现数据过错,这个是需求防止的。
相对注册机制,音讯机制是咱们所了解的一种底层向上层传递的方法,msOS选用uC/OS-II,标配为事务逻辑与菜单界面两个使命,事务逻辑为高优先级,支撑音讯行列,设备发送的音讯,都在事务逻辑中处理。
需求留意的是,msOS是选用的是uC/OS-II,它归于RTOS,事务逻辑与菜单界面虽然是两个独立的使命,但并不是一起运转的,一个时间只能运转一个使命,事务逻辑的使命优先级高于菜单界面,所以在没有音讯的时分,事务逻辑使命(LogicTask)在PendMessageQueue函数中挂起等候音讯到来,这个时分退到菜单界面使命(MenuTask)履行,一旦按键设备检测到按键并经过PostMessageToLogicTask发送音讯,就会激活事务逻辑使命,让事务逻辑使命抢占菜单界面使命运转。按键设备的运转是根据体系节拍的,它是在中止中运转,优先级比使命高,不会被使命抢占。