当前位置: 首页 > wzjs >正文

网站建设公司做网站需要注意什么软件下载类型网站怎么做

网站建设公司做网站需要注意什么,软件下载类型网站怎么做,北京全包圆装修公司好不好,微信第三方网站怎么做简介 图片 在RT-thread 代码中对初始化代码部分是可以自动的进行初始化操作,而不需要进行手动的调用初始化接口。我们可以参照其代码实现将我们的代码初始化部分使用自动初始化的方式来实现。自动初始化的原理是将初始话函数指针放到一个特定的section&#xff08…

简介

图片

在RT-thread 代码中对初始化代码部分是可以自动的进行初始化操作,而不需要进行手动的调用初始化接口。我们可以参照其代码实现将我们的代码初始化部分使用自动初始化的方式来实现。自动初始化的原理是将初始话函数指针放到一个特定的section(容器)中,让后根据section 的起始和结束地址之间的函数指针进行调用,从而完成初始化函数的自动调用完成初始化。

图片

图片
功能需求

本地初始化按照是否依赖操作系统进行分类可以分为系统相关及非系统相关,类如某些初始化会创建互斥锁来保护互斥访问保护临界区,这种初始话处理需要系统启动后才能进行,不依赖系统相关的初始化系统启动前就可以进行初始化。

自动初始化还需要可以配置初始化的顺序来避免初始化之间有顺序的依赖关系的场景。

图片
代码对应

该功能实现的第一步需要在一个容器内将初始化函数进行统一管理保存,方便统一管理,将这些符号放入到容器统一管理,本地的IAR环境需使section,告诉编译器要将这些符号放在一起统一管理,同时如果这些符号没有被直接调用,需要告诉编译器这些符号需要帮我保留不要擅自优化掉。

在IAR 环境下要将符号保存到section 和 保留对应符号要加如下的修饰符。

#define section(x) @ x

#define used __root

IAR 中可以使用@ section_name 来修饰函数及变量,对应说明如下

image.png

IAR 中告诉编译器保留对应的符号使用__root 来修饰变量及符号,对应说明如下

image.png

使用RT-thread 的声明初始化函数section 定义宏INIT_EXPORT 将函数符号放入特定的section 中

/********************************************************************************************************

  •                             Global Macro definition                                              * 
    

*******************************************************************************************************/

typedef int (*init_fn_t)(void);

#ifdef DEBUGING_AUTO_INIT

struct init_desc  {  const char* fn_name;  const init_fn_t fn;  };  #define INIT_EXPORT(fn, level)                                                       \  const char __rti_##fn##_name[] = #fn;                                            \  used const struct init_desc __init_desc_##fn ection(".ini_fn." level) =          \  { __rti_##fn##_name, fn};  

#else

#define INIT_EXPORT(fn, level)                                                       \  used const init_fn_t __init_##fn section(".ini_fn." level) = fn  

#endif

上述宏INIT_EXPORT 宏会定义.init_fn.xx的section,我们之前提到除了需要一个容器对函数进行管理,上面的宏已经可以对函数符号进行容器化的管理,同时我们还需要根据自己的是需求来配置容器内函数的顺序,可以让设置xx 的数值让编译器来帮我们实现指定顺序,编译器会按照符号的命名来进行符号的排序,类如INIT_EXPORT (fn,“1.0”) 就会在INIT_EXPORT (fn,“1.1”) 的前面我们可以利用该特性来实现容器内的函数排序。

有了上述的认识,我们可以通过定义level “1.xx” 至 "1.end " 区间的函数为非系统依赖的初始化容器,level 2.0 至 levle 6.0 之间的函数为依赖系统的初始化函数,使用rt-thread内的初始化调用函数完成这两个类型的函数初始化处理,对应的自动初始化代码调用如下:

static int rti_start(void)

{

return 0;  

}

INIT_EXPORT(rti_start, “0”);

static int rti_board_start(void)

{

return 0;  

}

INIT_EXPORT(rti_board_start, “0.end”);

static int rti_board_end(void)

{

return 0;  

}

INIT_EXPORT(rti_board_end, “1.end”);

static int rti_end(void)

{

return 0;  

}

INIT_EXPORT(rti_end, “6.end”);

/**

  • @brief Onboard components initialization. In this function, the board-level

  •     initialization function will be called to complete the initialization 
    
  •     of the on-board peripherals. 
    

*/

void components_board_init(void)

{

#ifdef DEBUGING_AUTO_INIT

int result;  const struct rt_init_desc *desc;  for (desc = &__rt_init_desc_rti_board_start; desc < &__rt_init_desc_rti_board_end; desc ++)  {  printf("initialize %s", desc->fn_name);  result = desc->fn();  printf(":%d done\n", result);  }  

#else

volatile const init_fn_t *fn_ptr;  for (fn_ptr = &__init_rti_board_start; fn_ptr < &__init_rti_board_end; fn_ptr++)  {  (*fn_ptr)();  }  

#endif /* DEBUGING_AUTO_INIT */

}

/**

  • @brief RT-Thread Components Initialization.

*/

void components_app_init(void)

{

#ifdef DEBUGING_AUTO_INIT

int result;  const struct rt_init_desc *desc;  printf("do components initialization.\n");  for (desc = &__init_desc_rti_board_end; desc < &__init_desc_rti_end; desc ++)  {  printf("initialize %s", desc->fn_name);  result = desc->fn();  printf(":%d done\n", result);  }  

#else

volatile const init_fn_t *fn_ptr;  for (fn_ptr = &__init_rti_board_end; fn_ptr < &__init_rti_end; fn_ptr ++)  {  (*fn_ptr)();  }  

#endif /* DEBUGING_AUTO_INIT */

}

按照上面level “1.xx” 至 "1.end " 区间的函数为非系统依赖的初始化容器,level 2.0 至 levle 6.0 之间的函数为依赖系统的初始化函数 的管理方式,定义如下的初始化函数声明宏来管理初始化调用,暂时只定义三个level 足够我们使用,可以扩展的空间也很大根据实际情况来调整。

/* board init */

#define INIT_BOARD_EXPORT_LEVEL1(fn) INIT_EXPORT(fn, “1.1”)

#define INIT_BOARD_EXPORT_LEVEL2(fn) INIT_EXPORT(fn, “1.2”)

#define INIT_BOARD_EXPORT_LEVEL3(fn) INIT_EXPORT(fn, “1.3”)

/* os run init */

#define INIT_OSRUN_EXPORT_LEVEL1(fn) INIT_EXPORT(fn, “2.1”)

#define INIT_OSRUN_EXPORT_LEVEL2(fn) INIT_EXPORT(fn, “2.2”)

#define INIT_OSRUN_EXPORT_LEVEL3(fn) INIT_EXPORT(fn, “2.3”)

图片
代码对应
验证功能前我们先看下我们现有的初始化代码,对应初始化代码如下,adc/i2c 初始化如下。

image.png

我么修改代码使用自动初始化的方式,声明i2c 初始化调用为level1

image.png

配置adc 初始化为level2

image.png

声明后我们不需要之前显性的调用接口,在main 函数内调用初始化调用自动调用接口即可,代码相对之前会简洁。

image.png

根据配置level i2c 初始化调用 要在adc 初始化之前,产看对应的map文件也可以看出i2c在容器内部地址是靠前相对会被优先调用。

image.png

上述map 中符号的布局跟之前分析的一致,我们编译代码运行结果如下,发现I2c/adc初始化函数已经被调用,I2C初始化也是在ADC之前跟设计的保持一致。

image.png

上述运行结果跟预期的保持一致,功能验证通过,这里介绍了依赖系统相关的自动初始化,依赖系统的处理也是类似在此就不重复赘述了。

原文 https://forum.eepw.com.cn/thread/391337/1

http://www.dtcms.com/wzjs/781054.html

相关文章:

  • 如何做网站推广方法公司软文怎么写
  • 网站服务器问题高端大气的企业网站模板
  • 去哪儿网站开发简述网络营销策略
  • 个性化网站建设报价软件开发最新技术
  • 江苏齐力建设集团网站重庆做网站
  • 苏州网站建设sz sogou如何做网络营销推广工作
  • 上海制作网站陕西省信用建设官方网站
  • 国外科技网站欣赏苏州营销网站建设公司哪家好
  • 石家庄住房和城乡建设厅官方网站软件商城源码
  • 山西省城乡住房和建设厅网站做网站需要花费那方面的钱
  • 推进门户网站建设方案电子商务包括哪些内容
  • 廊坊哪里有做网站的中宁网站建设
  • 网络站点推广的方法有哪些中国义乌网
  • 学校网站建设栏目有哪些房子装修风格大全2021新款
  • 网站生成器怎么做国家工商注册查询系统官网
  • 福州网站建设印秀网址转化短链接
  • 做面包有关电影网站去西安需要隔离吗
  • 西安网站建设比较好的公司怎么去创立一个网站
  • 陕西住房和城乡建设厅网站电话自己制作网站的方法
  • 网站开发公司赚钱么中企动力这个公司怎么样
  • 淘宝客网站怎么做seo网络规划设计师科目分类
  • 苏州免费发布信息网站百度网页怎么设置成电脑版
  • 美橙互联网站建设案例赚钱的网站平台
  • 小树建站平台制作ppt的网站
  • 网站开发公司商业计划书搞笑视频素材网站免费
  • 宿州信息网福州seo优化
  • 关于网站建设的广告词汉川做网站
  • 搭建微网站的基本流程新手做外贸怎么入门
  • 公司网站建设任务书网站建设放在什么科目
  • 济南地铁建设合肥seo结算