单片机静态信号槽实现记录

记录一下,明天需要实现的静态信号槽,利用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);

posted @ 2022-05-08 20:08  大高玩子  阅读(62)  评论(0编辑  收藏  举报