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

少儿编程自学网站良品铺子网络营销策划书

少儿编程自学网站,良品铺子网络营销策划书,养老院网站建设的费用,免费logo图片生成器 自动生成汇编程序调用 C 程序详情 在 C 程序和 ARM 汇编程序之间相互调用时必须遵守 ATPCS 规则#xff0c;其是基于 ARM 指令集和 THUMB 指令集过程调用的规范#xff0c;规定了调用函数如何传递参数#xff0c;被调用函数如何获取参数#xff0c;以何种方式传递函数返回值。 寄存…汇编程序调用 C 程序详情 在 C 程序和 ARM 汇编程序之间相互调用时必须遵守 ATPCS 规则其是基于 ARM 指令集和 THUMB 指令集过程调用的规范规定了调用函数如何传递参数被调用函数如何获取参数以何种方式传递函数返回值。 寄存器 R0~R15 在 ATPCS 规则的使用 在函数中通过寄存器 R0~R3 来传递参数被调用的函数在返回前无需恢复寄存器 R0~R3 的内容。 在函数中通过寄存器 R4~R11 来保存局部变量。 寄存器 R12 用作函数间 scratch 寄存器。 寄存器 R13 用作栈指针记作 SP 在函数中寄存器 R13 不能用做其他用途寄存器 SP 在进入函数时的值和退出函数时的值必须相等。 寄存器 R14 用作链接寄存器记作 LR 它用于保存函数的返回地址如果在函数中保存了返回地址则 R14 可用作其它的用途。 寄存器 R15 是程序计数器记作 PC 它不能用作其他用途。 汇编程序向 C 程序函数传递参数 当参数小于等于 4 个时使用寄存器 R0~R3 来进行参数传递。 当参数大于 4 个时前四个参数按照上面方法传递剩余参数传送到栈中入栈的顺序与参数顺序相反即最后一个参数先入栈。 C 程序函数返回结果给汇编程序 结果为一个 32 位的整数时通过寄存器 R0 返回。 结果为一个 64 位整数时通过 R0 和 R1 返回依此类推。 结果为一个浮点数时通过浮点运算部件的寄存器 f0d0 或 s0 返回。 结果为一个复合的浮点数时通过寄存器 f0-fN 或者 d0~dN 返回。 对于位数更多的结果通过调用内存来传递。 当 C 程序从一个函数跳转到另一个函数时会先把源函数的 CPU 的寄存器和函数内的局部变量都入栈当跳回时再出栈这一过程的汇编代码是当 C 程序编译成汇编时被编译器自动添加。 imx6ull 裸机编程相关 这里是处理器启动流程等的介绍属于科普环节有个印象会加深对于处理器如何运行的理解非必要记住而是为以后的操作说明每一个步骤都在做什么事情。此部分理解为主。 裸机映像文件合成详情 先说原理看 imx6ull 芯片手册可知芯片上电时内部的 boot ROM 固化的程序会通过外部引脚确定启动方式USB\NAND\EMMC\SD等将应用的二进制数据app.bin从存储区NAND\EMMC\SD等搬运到内存区DDR2\3等然后跳转到内存区的程序处开始执行程序。这个过程是这个芯片自动完成的但是需要根据规定合成烧录到存储区的映像文件 在编译得到应用的二进制文件 app.bin这个就是比如 裸机应用固件 或 Linux 固件等之后再用 mkimage 工具gcc-arm-linux-gnueabihf-6.2.1 编译器自带的根据 imximage.cfg.cfgtmp 这个文件的信息合成头部信息再与 app.bin 组合生成 .imx 文件 .imx 的头部再添加 1KB 的数据可以全为0也可包含分区表等数据 组合生成 .img 文件具体如下 .imx 文件 头部信息 IVT Boot data DCD app.bin - 用于在烧写工具中烧写到 EMMC 中烧写工具会自动将其烧写到 1KB 偏移处。 .img 文件 1k.bin .imx 文件 1k.bin 头部信息 IVT Boot data DCD app.bin - 用于在烧写工具中烧写到 SD 中烧写工具会将其烧写到 0 位置处对与 SD 的烧写此工具不会自动加 1KB 偏移...。 头部信息包含了指示 boot ROM 程序要把 app.bin 数据搬运到内存的何处其大小以及包含了配置 DDR 的寄存器、引脚等数据等待具体如下 IVTImage vector table含 header含 tag、length、version这 3 项length 表示 IVT 的大小、entry指示 app.bin 在内存中的位置即程序数据被复制到内存哪里、dcd指示 DCD 数据 在内存中的位置、boot_data指示 Boot data 在内存中的位置、self指示 IVT 在内存中的位置等共占 32*8bit 大小entry 为 app.bin 要在内存中的目的地址。 Boot datastart映像文件在内存中的地址为 IVT 在内存中的绝对地址减去 1024 偏移、length整个映像文件的长度含 1k.bin、plugin共占 32*3bit 大小。 DCD配 imx6ull 芯片的寄存器如 DDR 的配置等可自定复杂mkimage 根据 imximage.cfg.cfgtmp 这个文件的信息合成。 其中entry指示 app.bin 在内存中的位置即程序数据被复制到内存哪里的地址在 Makefile 中调用 mkimage 工具时是可以指定的在重定位章节会细说。 具体分布 头部数据和偏移区使用 mkimage 工具生成官方都会提供的。 最前面的灰色部分就是偏移数据区对于EMMC/SD存储区设备是 1KB对于 NAND 是256B具体看手册。 最终生成的 .img 文件结构 imx6ull 上电启动过程分析 boot Rom 会把 EMMC 或 SD 卡的前 4K 数据涵盖了头部信息 IVT Boot data DCD这些等读入到芯片内部 RAM 运行。 boot Rom 根据 DCD 进行初始化 DDR。 boot Rom 根据 IVT从 EMMC 或 SD 卡中将 app.bin 读到 DDR 的 0x80100000 地址IVT 的 entry如上图所示。 跳转到 DDR 的 0x80100000 地址执行即 CPU 开始从内存 0x80100000 地址开始执行机器码。 以上步骤执行完之后的 DDR 内存图示这是反汇编 应用固件 产生的 机器码-汇编码 相互对应的内容 重定位、启动和编译 各段数据重排序 每一个汇编成机器码的 .o 文件都会分为这几个数据段 代码段(.text)存放代码指令 只读数据段(.rodata)存放有初始值并且 const 修饰的全局类变量 数据段(.data)存放有初始值的全局类变量有非零初始值的变量如 char A A; 零初始化段(.bss)存放没有初始值或初始值为0的全局类变量如 int g_intA 0;int g_intB;这些存放在 .bss 段 注释段(.comment)存放注释。 在 Makefile 文件中在链接步骤通过 LD 工具把各个 .o 文件的各个数据段按照 imx6ull.lds 定义的顺序安放即各段数据重排序最后合成一个二进制文件 app.bin其中的代码段(.text)、只读数据段(.rodata)和数据段(.data)等都来自于前面各个 .o 文件每个段 的顺序按照 imx6ull.lds 安放。 链接脚本 imx6ull.lds 解析一体式链接脚本格式 SECTIONS {. 0x80100000;                     //设定链接地址为0x80100000 ​. ALIGN(4);                       //将当前地址以4字节为标准对齐.text     :                         //创建段其名称为 .text{                                   //.text包含的内容为所有链接文件的数据段*(.text)                         // *表示所有文件} ​. ALIGN(4);                       //将当前地址以4字节为标准对齐.rodata : { *(.rodata) }             //.rodata存放在.text之后,包含所有链接文件的只读数据段 ​. ALIGN(4);.data : { *(.data) }                 //.data存放在.rodata之后包含所有链接文件的只读数据段 ​. ALIGN(4);__bss_start .;                     //将当前地址的值存储为变量__bss_start.bss : { *(.bss) *(.COMMON) }       //.bss存放在.data段之后, 包含所有文件的bss段和注释段__bss_end .;                       //将当前地址的值存储为变量__bss_end } ​ 可见 imx6ull.lds 文件给出 .bss 段的头、尾地址标识__ bss_start 和 __ bss_end。 启动文件程序 以最简单的裸机点灯程序的启动文件 start.S 为例。仅为示例过于简单完整示例可看 下面 “ARM异常处理 启动文件的示例” 一节。 .text .global  _start _start: /* 设置栈地址 */ldr  sp,0x80200000bl main ​ halt:b  halt Makefile 文件解析 以最简单的裸机点灯程序的 makefile 为例。 PREFIXarm-linux-gnueabihf- CC$(PREFIX)gcc LD$(PREFIX)ld AR$(PREFIX)ar OBJCOPY$(PREFIX)objcopy OBJDUMP$(PREFIX)objdump ​ led.img : start.S led.c main.c$(CC) -nostdlib -g -c -o start.o start.S                 # 把启动文件 .s 和各个 .c 文件都汇编为机器码文件 .o$(CC) -nostdlib -g -c -o led.o led.c $(CC) -nostdlib -g -c -o main.o main.c $(LD) -T imx6ull.lds -g start.o led.o main.o -o led.elf  # 链接按照 imx6ull.lds 定义的格式各段数据重排序把各个 .o 文件组成 .elf 文件$(OBJCOPY) -O binary -S led.elf led.bin                 # .elf 转为 .bin 二进制文件应用二进制文件$(OBJDUMP) -D -m arm led.elf led.dis mkimage -n ./tools/imximage.cfg.cfgtmp -T imximage -e 0x80100000 -d led.bin led.imx# 使用 mkimage 生成 头部数据并与 .bin 组合产生 .imx 文件dd if/dev/zero of1k.bin bs1024 count1                # 创建一个 1KB 的空文件 1k.bincat 1k.bin led.imx led.img                             # 把 1k.bin 放在 .imx 前头组合成 .img 文件 ​ clean:rm -f led.dis led.bin led.elf led.imx led.img *.o ​ 清零 bss 段 在 启动文件 汇编程序中根据 .bss 段的头、尾地址__ bss_start、__ bss_end来对此区域清零让 C 程序中未定义初始值或零初始值的变量在初始化时都为零值而非随机值。 附程序 clean_bss:ldr r1, __bss_start     将链接脚本变量__bss_start变量保存于r1ldr r2, __bss_end       将链接脚本变量__bss_end变量保存于r2mov r3, #0 clean:strb r3, [r1]           将当前地址下的数据清零add r1, r1, #1         将r1内存储的地址1cmp r1, r2               相等清零操作结束否则继续执行clean函数清零bss段bne cleanmov pc, lr 并在进入主函数前调用 bl clean_bss /* 清零bss段 */。 数据段再单独重定位 事出有因想要把 .data 段的数据放到 片内内存中以加快访问速度参考芯片手册得到片内RAM的地址为0x900000 ~ 0x91FFFF共128KB当然不会很大也就裸机下的编一编、学一学行Linux 系统等的大型工程就不适合了所以我们将 .data 段重定位后的地址设置为0x900000。 第一步把链接脚本 imx6ull.lds 中的 .data : { *(.data) }换成下面的 data_load_addr .; .data 0x900000 : AT(data_load_addr) {data_start . ;                 //addr 0x900000*(.data)data_end . ;                   //addr 0x900000 SIZEOF(.data)} 第二步在启动文件中复制 data 段数据到片内内存 data_start copy_data:/* 重定位data段 */ldr r1, data_load_addr  /* data段的加载地址, 从链接脚本中得到, 0x8010xxxx */ldr r2, data_start /* data段重定位地址, 从链接脚本中得到, 0x900000 */ldr r3, data_end     /* data段结束地址, 从链接脚本中得到,0x90xxxx */cpy:ldr r4, [r1]        /* 从r1读到r4 */str r4, [r2]        /* r4存放到r2 */add r1, r1, #4   /* r11 */add r2, r2, #4   /* r21 */cmp r2, r3       /* r2 r3比较 */bne cpy       /* 如果不等则继续拷贝 */ ​mov pc, lr       /* 跳转回调用copy_data函数之前的地址 */ 并在进入主函数前调用 bl copy_data /* 复制 data 段数据到片内内存 data_start */ 100ask imx6ull 的 《IMX6ULL裸机开发完全手册》中的 第13篇 IMX6ULL裸机开发 - 9.4.3 总结:如何在C函数中使用链接脚本变量 章节讲了如何在 C 程序中调用链接脚本中的表示地址的变量从而可以在 C 程序中实现 清零 bss 段和数据段搬运到片内内存而不用在启动代码里完成这些操作。 100ask imx6ull 的 《IMX6ULL裸机开发完全手册》中的 第13篇 IMX6ULL裸机开发 - 9.5 重定位全部代码 章节讲了将全部应用的二进制数据搬到芯片的内部内存128KB并在其内运行并且使用 C 程序实现 bss 段清零。其步骤是第一步修改链接脚本段顶位置加上 . 0x900000;并加上头、尾的地址标识字符第二步在 C 程序中利用头、尾的地址标识字符将其间的数据搬运到芯片内部内存地址第三步修改启动文件汇编程序跳转到内部内存的应用数据处执行。 修改应用在内存中的存放地址 IVT 中的 entry指示 app.bin 在内存中的位置即程序数据被复制到内存哪里的地址在 Makefile 中调用 mkimage 工具时是可以指定需要改相关联的几个地方如下 假设应用的二进制数据app.bin原来是要存放在内存的 0x80100000 位置现在要改为 app_address 处。 Makefile 文件中修改 -e 选项后的地址 mkimage -n ./tools/imximage.cfg.cfgtmp -T imximage -e 0x80100000 -d relocate.bin relocate.imx。 链接脚本 imx6ull.lds 中 SECTIONS { . 0x80100000;... 此处改为 app_address 。 启动文件 start.S 内要修改栈地址 spldr sp,0x80200000 此处根据 app_address 与 0x80100000 的偏移相应修改对于小的裸机程序可以至少比 app_address 大 0x00100000。 100ASK IMX6ULL Flashing Tool 工具使用 通过 USB 运行裸机程序不需要烧写通过u-boot直接在内存中运行 板子设到 USB 启动在 100ask_imx6ull_flashing_tool 工具中的“专业版”界面打开 .imx 文件直接点运行。 通过 USB 烧写裸机程序 板子设到 USB 启动在 Tool 中的“基础版”界面若选 EMMC 则用 .imx 文件若选 SD 则用 .img 文件。成功后断电切到 EMMC 或 SD 启动模式再上电。 或者在 win 上用 win disk imager 工具把 .img 文件写到 SD 卡。 基础版界面详情 按钮作用烧写整个系统“选择设备”为EMMC时把emmc.img烧到EMMC上 “选择设备”为SD/TF时把sdcard.img烧到SD/TF卡上 “选择设备”为NAND时把rootfs.ubi烧到Nand Flash上 并且会烧写对应的U-Boot请看下面的“更新Uboot”按钮说明。更新内核把zImage上传到根文件系统的/boot目录 (对于Nand是直接烧到内核分区)更新设备树把100ask_imx6ull-14x14.dtb上传到根文件系统的/boot目录 (对于Nand是直接烧到设备树分区)更新Uboot对于IMX6ULL全功能版 ①“选择设备”为EMMC时把u-boot-dtb.imx烧写到EMMC ②“选择设备”为SD/TF时把u-boot-dtb.imx烧写到SD/TF卡 对于IMX6ULL mini nand版 ①“选择设备”为NAND时把u-boot-dtb_nand.imx烧写到Nand Flash ②“选择设备”为SD/TF时把u-boot-dtb_nandsd.imx烧写到SD/TF卡烧写裸机把所选裸机文件烧写到EMMC、SD/TF卡或Nand Flash上传文件把所选用户文件上传到根文件系统的/目录 对于imx6ull mini nand版无法上传文件(只支持ext4文件系统而它不是)
http://www.yutouwan.com/news/145863/

相关文章:

  • 青海建设协会网站郑州量站站软件开发有限公司
  • 九五至尊娱乐场网站北京晨钟科技有限公司订单查询
  • 厦网站建设培训深圳人才市场现场招聘信息
  • wordpress建站打不开二级页面天猫与京东的网站建设管理
  • 佛山精品网站建设麻涌镇网站建设
  • 视频网站开发费用常州模板建站哪家好
  • 成都网站开发制作wordpress手机端菜单被挤到第二行
  • 上海网站建设的价格低交互网站怎么做的
  • 网站搭建就来徐州百度网络非常好公司logo注册
  • 学校网站建设制度微趋道官网手机小程序制作
  • 网站查询站长工具网站实施过程
  • 做整装的网站更改各网站企业信息怎么做
  • .net flash网站模板不同类型网站
  • 做网站学的是代码吗网站的内部链接如何做
  • 网站怎么做能让人搜到有哪些网站做外贸的
  • 山西时代网站建设wordpress基本
  • 如何做网络集资网站《梦幻西游》官网
  • 网站开发工作怎么样pc响应式网站设计
  • 网站建设漂亮的模板android基础入门教程
  • 做刷单网站犯法吗线上推广如何引流
  • 电商网站模板网站代码 公告栏 php
  • 开源的网站后台程序网站的建设与运营
  • 网站建设的需求是什么意思网站建设公司做的网站
  • 建设考试的报名网站wordpress html5播放优酷
  • 建站流程网站上线当当网网站内容建设的分析
  • 网站建设服务市场趋势大宗商品期货交易平台
  • 上海协策网站制作金融网站织梦模板
  • dede网站开发步骤网站建设公司合伙人
  • 专业做胶粘剂招聘网站展示页网站怎么做排名
  • 有多少做汽车的网站dw自己做网站