__attribute__中的section的应用

接上篇文章,理解了这个技巧那么就该实用了,碰巧前段时间接触了cevent的开源项目就是这个原理实现的,有效的降低了程序的耦合性,提高程序的分离和稳定性。

/**
 *******************************************************************************
 ** \brief  cevent 实现过程解析
 ** 传统的代码 每个外设实现好在主程序开始进行顺序处理,但是这种方法会造成外设和main的耦合性增高。
 ** cevent 通过#define SECTION(level)  __attribute__((used,__section__(".fn_cmd."level)))的方式将函数定义到指定的Text段(代码段)
 ** 在main只需要将指定好的Text段从起始位置做一个轮询就可以实现各个外设的初始化,当然不局限于初始化函数,其他任务函数也可以通过这种
 ** 方式实现,通过event的大小决定执行的顺序,有限解决耦合性。
 **
int temp1 = 2; //放在data段
int temp2 = 0; //放在bss段(初始化为0相当于没有初始化)
int temp1;     //放在bss段(所以全局变量定义时不用初始化)

int main(void)
{
	SysClkInit();
	
	ceventInit();
    ceventPost(EVENT_INIT_STAGE);  //timer usart/**减小耦合*/
     //初始化函数用一个event
	
	SysTick_Init(1000u);  //1ms
	while(1)
	{
		#if cevent_t
		ceventPost(EVENT_APP_STAGE2);   /**减小耦合*/
		//任务函数根据先后顺序注册函数,或者用状态机
		//左边的工程目录就是注册顺序(在相同的event情况下)  led -- usart -- timer
		//如果想要有特定的顺序,改变event即可
		Ddl_Delay1ms(2000);
		#endif
		
		#if cpost_t
		cpostProcess();                     /**cpost代替全局变量*/
		#endif	
	}
	
}
void usart_init(void);
void usart_event(void);

CEVENT_EXPORT(EVENT_INIT_STAGE, usart_init);
CEVENT_EXPORT(EVENT_APP_STAGE2, usart_event);

void timer0_init(void);
void timer_event(void);

CEVENT_EXPORT(EVENT_INIT_STAGE, timer0_init);
CEVENT_EXPORT(EVENT_APP_STAGE2 ,timer_event);
/**
 * @brief 广播event事件
 * 
 * @param event 事件
 * 
 */
void ceventPost(unsigned short event)
{
    ceventHandler(event);
}
/**
 * @brief cevent处理
 * 
 * @param event 事件
 * 
 */
static void ceventHandler(unsigned short event)
{
    for (size_t i = 0; i < ceventTable.count; i++)
    {
        if (ceventTable.base[i].event == event)
        {
            ceventRun(&(ceventTable.base[i]));
        }
    }
}
/**
 * @brief 导出事件
 * 
 * @param _event 事件
 * @param _func 注册函数
 * @param ... 参数
 */
#define CEVENT_EXPORT(_event, _func, ...) \
        const void *cEventParam##_event##_func[] = {(void *)_func, ##__VA_ARGS__}; \
        const CEvent SECTION("cEvent") cEvent##_event##_func = \
        { \
            .param = cEventParam##_event##_func, \
            .paramNum = sizeof(cEventParam##_event##_func) / sizeof(void *), \
            .event = _event, \
        }

在这里插入图片描述

看懂了上一篇文章这篇就很容易懂了,注意看主函数上边的注释,会解释section的顺序问题的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值