单片机静态信号槽实现记录
记录一下,明天需要实现的静态信号槽,利用GCC 预编译段配置特性,实现 单片机 信号槽特性,理论上性能很高,因为对应的回调函数都在预编译阶段确定了下来,所以可以用于特定的场合。局限性就是槽函数无法动态添加删除,只能固定,但是用于特定场合,可以节约单片机资源,提高通信效率。以下为代码:
#include "rxm.h"
#define SEC_START_TXT(signame) ".sig"#signame".0.end"
#define SEC_END_TXT(signame) ".sig"#signame".1.end"
#define SEC_MID_TXT(signame) ".sig"#signame".1."
#define SIG_INIT_START(signame,fn) RX_USED const init_fn_t __rx_init_##fn SECTION(SEC_START_TXT(signame)) = fn
#define SIG_INIT_END(signame,fn) RX_USED const init_fn_t __rx_init_##fn SECTION(SEC_END_TXT(signame)) = fn
#define SIG_INIT(signame,fn) RX_USED const init_fn_t __rx_init_##fn SECTION(SEC_MID_TXT(signame)) = fn
#define INIT_SIG(signame) void RxSIG##signame##InitStart(void){} SIG_INIT_START(signame,RxSIG##signame##InitStart); void RxSIG##signame##InitEnd(void){} SIG_INIT_END(signame,RxSIG##signame##InitEnd);
#define SLOT(signame,signo) extern void sig_##sigid##signo(void); SIG_INIT(signame,sig_##sigid##signo); void sig_##sigid##signo(void)
void emits(const init_fn_t* s,const init_fn_t* e)
{
const init_fn_t *fn_ptr;
for(fn_ptr =s;fn_ptr<=e;fn_ptr++)
{
(*fn_ptr)();
}
}
#define emit(signame) emits(&__rx_init_RxSIG##signame##InitStart,&__rx_init_RxSIG##signame##InitEnd);
enum
{
SIG_KEY1,
SIG_KEY2
};
INIT_SIG(SIG_KEY1);
INIT_SIG(SIG_KEY2);
SLOT(SIG_KEY1,1)
{
}
SLOT(SIG_KEY1,2)
{
}
void key_init(void)
{
emit(SIG_KEY1);
}
DRV_INIT(key_init);