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

湖南建立网站营销设计网页链接制作生成

湖南建立网站营销设计,网页链接制作生成,网站建设技术支持有什么,潍坊网页网站制作linker list是利用lds 描述符实现同类型数据连续排布的一种机制。 下面是uboot里面的应用说明 lds文件里面需要增加section描述#xff1a; . ALIGN(4);.u_boot_list : {KEEP(*(SORT(.u_boot_list*)));}linker_list.h: /* SPDX-License-Identifier: GPL-2.0 */ /** include…linker list是利用lds 描述符实现同类型数据连续排布的一种机制。 下面是uboot里面的应用说明 lds文件里面需要增加section描述 . ALIGN(4);.u_boot_list : {KEEP(*(SORT(.u_boot_list*)));}linker_list.h: /* SPDX-License-Identifier: GPL-2.0 */ /** include/linker_lists.h** Implementation of linker-generated arrays** Copyright (C) 2012 Marek Vasut marexdenx.de*/#ifndef __LINKER_LISTS_H__ #define __LINKER_LISTS_H__#include linux/compiler.h/** There is no use in including this from ASM files.* So just dont define anything when included from ASM.*/#if !defined(__ASSEMBLY__)/*** llsym() - Access a linker-generated array entry* _type: Data type of the entry* _name: Name of the entry* _list: name of the list. Should contain only characters allowed* in a C variable name!*/ #define llsym(_type, _name, _list) \((_type *)_u_boot_list_2_##_list##_2_##_name)/*** ll_entry_declare() - Declare linker-generated array entry* _type: Data type of the entry* _name: Name of the entry* _list: name of the list. Should contain only characters allowed* in a C variable name!** This macro declares a variable that is placed into a linker-generated* array. This is a basic building block for more advanced use of linker-* generated arrays. The user is expected to build their own macro wrapper* around this one.** A variable declared using this macro must be compile-time initialized.** Special precaution must be made when using this macro:** 1) The _type must not contain the static keyword, otherwise the* entry is generated and can be iterated but is listed in the map* file and cannot be retrieved by name.** 2) In case a section is declared that contains some array elements AND* a subsection of this section is declared and contains some elements,* it is imperative that the elements are of the same type.** 3) In case an outer section is declared that contains some array elements* AND an inner subsection of this section is declared and contains some* elements, then when traversing the outer section, even the elements of* the inner sections are present in the array.** Example:** ::** ll_entry_declare(struct my_sub_cmd, my_sub_cmd, cmd_sub) {* .x 3,* .y 4,* };*/ #define ll_entry_declare(_type, _name, _list) \_type _u_boot_list_2_##_list##_2_##_name __aligned(4) \__attribute__((unused, \section(.u_boot_list_2_#_list_2_#_name)))/*** ll_entry_declare_list() - Declare a list of link-generated array entries* _type: Data type of each entry* _name: Name of the entry* _list: name of the list. Should contain only characters allowed* in a C variable name!** This is like ll_entry_declare() but creates multiple entries. It should* be assigned to an array.** ::** ll_entry_declare_list(struct my_sub_cmd, my_sub_cmd, cmd_sub) {* { .x 3, .y 4 },* { .x 8, .y 2 },* { .x 1, .y 7 }* };*/ #define ll_entry_declare_list(_type, _name, _list) \_type _u_boot_list_2_##_list##_2_##_name[] __aligned(4) \__attribute__((unused, \section(.u_boot_list_2_#_list_2_#_name)))/** We need a 0-byte-size type for iterator symbols, and the compiler* does not allow defining objects of C type void. Using an empty* struct is allowed by the compiler, but causes gcc versions 4.4 and* below to complain about aliasing. Therefore we use the next best* thing: zero-sized arrays, which are both 0-byte-size and exempt from* aliasing warnings.*//*** ll_entry_start() - Point to first entry of linker-generated array* _type: Data type of the entry* _list: Name of the list in which this entry is placed** This function returns (_type *) pointer to the very first entry of a* linker-generated array placed into subsection of .u_boot_list section* specified by _list argument.** Since this macro defines an array start symbol, its leftmost index* must be 2 and its rightmost index must be 1.** Example:** ::** struct my_sub_cmd *msc ll_entry_start(struct my_sub_cmd, cmd_sub);*/ #define ll_entry_start(_type, _list) \ ({ \static char start[0] __aligned(4) __attribute__((unused, \section(.u_boot_list_2_#_list_1))); \(_type *)start; \ })/*** ll_entry_end() - Point after last entry of linker-generated array* _type: Data type of the entry* _list: Name of the list in which this entry is placed* (with underscores instead of dots)** This function returns (_type *) pointer after the very last entry of* a linker-generated array placed into subsection of .u_boot_list* section specified by _list argument.** Since this macro defines an array end symbol, its leftmost index* must be 2 and its rightmost index must be 3.** Example:** ::** struct my_sub_cmd *msc ll_entry_end(struct my_sub_cmd, cmd_sub);*/ #define ll_entry_end(_type, _list) \ ({ \static char end[0] __aligned(4) __attribute__((unused, \section(.u_boot_list_2_#_list_3))); \(_type *)end; \ }) /*** ll_entry_count() - Return the number of elements in linker-generated array* _type: Data type of the entry* _list: Name of the list of which the number of elements is computed** This function returns the number of elements of a linker-generated array* placed into subsection of .u_boot_list section specified by _list* argument. The result is of an unsigned int type.** Example:** ::** int i;* const unsigned int count ll_entry_count(struct my_sub_cmd, cmd_sub);* struct my_sub_cmd *msc ll_entry_start(struct my_sub_cmd, cmd_sub);* for (i 0; i count; i, msc)* printf(Entry %i, x%i y%i\n, i, msc-x, msc-y);*/ #define ll_entry_count(_type, _list) \({ \_type *start ll_entry_start(_type, _list); \_type *end ll_entry_end(_type, _list); \unsigned int _ll_result end - start; \_ll_result; \})/*** ll_entry_get() - Retrieve entry from linker-generated array by name* _type: Data type of the entry* _name: Name of the entry* _list: Name of the list in which this entry is placed** This function returns a pointer to a particular entry in linker-generated* array identified by the subsection of u_boot_list where the entry resides* and its name.** Example:** ::** ll_entry_declare(struct my_sub_cmd, my_sub_cmd, cmd_sub) {* .x 3,* .y 4,* };* ...* struct my_sub_cmd *c ll_entry_get(struct my_sub_cmd, my_sub_cmd, cmd_sub);*/ #define ll_entry_get(_type, _name, _list) \({ \extern _type _u_boot_list_2_##_list##_2_##_name; \_type *_ll_result \_u_boot_list_2_##_list##_2_##_name; \_ll_result; \})/*** ll_start() - Point to first entry of first linker-generated array* _type: Data type of the entry** This function returns (_type *) pointer to the very first entry of* the very first linker-generated array.** Since this macro defines the start of the linker-generated arrays,* its leftmost index must be 1.** Example:** ::** struct my_sub_cmd *msc ll_start(struct my_sub_cmd);*/ #define ll_start(_type) \ ({ \static char start[0] __aligned(4) __attribute__((unused, \section(.u_boot_list_1))); \(_type *)start; \ })/*** ll_end() - Point after last entry of last linker-generated array* _type: Data type of the entry** This function returns (_type *) pointer after the very last entry of* the very last linker-generated array.** Since this macro defines the end of the linker-generated arrays,* its leftmost index must be 3.** Example:** ::** struct my_sub_cmd *msc ll_end(struct my_sub_cmd);*/ #define ll_end(_type) \ ({ \static char end[0] __aligned(4) __attribute__((unused, \section(.u_boot_list_3))); \(_type *)end; \ })#endif /* __ASSEMBLY__ */#endif /* __LINKER_LISTS_H__ */ll_entry_declare_list 和ll_entry_declare差别是前者是数组声明一次可以声明多个条目后者只声明定义一个条目。 ll_entry_start(_type, _list) 获取该类型列表首个条目地址 ll_entry_get(_type, _name, _list) 根据名字 返回条目地址 ll_entry_count(_type, _list) 返回该类型条目数 使用实例 参考driver的定义 struct driver {char *name;enum uclass_id id;const struct udevice_id *of_match;int (*bind)(struct udevice *dev);int (*probe)(struct udevice *dev);int (*remove)(struct udevice *dev);int (*unbind)(struct udevice *dev);int (*ofdata_to_platdata)(struct udevice *dev);int (*child_post_bind)(struct udevice *dev);int (*child_pre_probe)(struct udevice *dev);int (*child_post_remove)(struct udevice *dev);int priv_auto_alloc_size;int platdata_auto_alloc_size;int per_child_auto_alloc_size;int per_child_platdata_auto_alloc_size;const void *ops; /* driver-specific operations */uint32_t flags; };/* Declare a new U-Boot driver */ #define U_BOOT_DRIVER(__name) \ll_entry_declare(struct driver, __name, driver)usb hub driver U_BOOT_DRIVER(usb_generic_hub) { .name “usb_hub”, .id UCLASS_USB_HUB, .of_match usb_hub_ids, .flags DM_FLAG_ALLOC_PRIV_DMA, };
http://www.dnsts.com.cn/news/274129.html

相关文章:

  • 河源网站开发东坑镇仿做网站
  • 传媒公司网站建设方案网络公司做网站后交代给客户什么
  • 东莞什么行业做网站的多宁波seo推广哪家好
  • 临沂罗庄做网站网络广告投放平台
  • 如何自己做网站卖东西建站模板网站设计
  • 佛山网站建设哪里好建设工程合同印花税计税依据
  • 专业做调查的网站昆明最新消息今天
  • 江苏城乡住房和城乡建设厅网站网站开发费用怎么做账
  • asp网站开发技术wordpress设计菜单
  • 如何申请做网站编辑呢内容营销是一种什么模式
  • 网站设计制作培训无代码开发小程序
  • 兰州网站建设lst0931wordpress 移动 主题
  • 网站运营招聘要求注册公司流程和费用
  • 市北网站建设企业宣传ppt的方案模板
  • 重庆网站建站公司域名查询网
  • 自学设计的网站浦江网站建设yw126
  • 网站备案 有效期长沙网站优化步骤
  • jsp网站地图生成器wordpress 用户修改密码
  • 北京网站开发价格网络营销的内容主要有哪些
  • 灰色行业做网站百度app下载安装 官方
  • 建设网站费用什么值得买wordpress模板
  • 镇江有哪些网站教你做吃的网站
  • 对网站建设心得51源码之家
  • 常用网站推广方法wordpress功能模块
  • 金融投资网站开发网站建设投资风险分析
  • 天津定制网站建设嘉峪关做网站
  • 中山网站网站建设旅游网站色彩搭配
  • 重庆网站设计开发培训学校百度竞价优缺点
  • 2018年网站建设培训会发言品牌建设对企业的意义
  • 营销型网站开发营销网站开发项目背景