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

网站如何做移动规则适配软件开发外包公司有哪些

网站如何做移动规则适配,软件开发外包公司有哪些,最佳建站模板,平面设计论文5000字目录 一、汇编点灯转 C 语言实现 1. 关键字#xff1a;volatile 2. 寄存器地址定义#xff08;两种方式#xff09; #xff08;1#xff09;直接宏定义地址 #xff08;2#xff09;结构体封装寄存器#xff08;优化访问#xff09; 3. 核心功能代码 #xff…目录 一、汇编点灯转 C 语言实现 1. 关键字volatile 2. 寄存器地址定义两种方式 1直接宏定义地址 2结构体封装寄存器优化访问 3. 核心功能代码 1时钟初始化打开所有时钟门 2LED 初始化引脚复用 GPIO 方向配置 3LED 控制亮、灭、闪烁 二、SDK 库文件 1. SDK文件选择 2. 基于 SDK 的点灯程序优化 三、BSP 工程管理与构建 1. 工程目录结构模块化管理 2. 蜂鸣器裸机驱动S8550 PNP 三极管 3. Makefile 优化多目录编译 4. 链接脚本imx6ull.lds 1.链接脚本的作用 2.各段及存储数据类型 一、汇编点灯转 C 语言实现 1. 关键字volatile 作用告诉编译器被修饰的变量值可能会被程序之外的因素如硬件寄存器、中断服务函数意外修改禁止编译器对该变量进行优化 在访问硬件寄存器时必须使用确保每次对寄存器的读写都是直接操作物理地址而非操作缓存值 2. 寄存器地址定义两种方式 1直接宏定义地址 通过#define将寄存器物理地址强制转换为对应类型的指针直接访问寄存器 2结构体封装寄存器优化访问 将同组寄存器如 GPIO1 的 DR、GDIR、PSR 等封装为结构体通过结构体指针映射到基地址 3. 核心功能代码 1时钟初始化打开所有时钟门 I.MX6ULL 外设默认时钟关闭需通过 CCM 寄存器开启对应外设时钟此处为简化操作直接打开所有时钟门 2LED 初始化引脚复用 GPIO 方向配置 引脚复用将GPIO1_IO03配置为 GPIO 功能复用值 0x05电气属性配置引脚驱动能力、上下拉等0x10B0 为常用配置GPIO 方向将GPIO1_IO03设为输出模式GDIR 寄存器对应位写 1 void led_init(void) {// 方式1直接操作寄存器无SDKIOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 0x05; // 引脚复用为GPIOIOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 0x10B0; // 配置引脚电气属性GPIO1_GDIR | (1 3); // GPIO1_IO03设为输出第3位写1// 方式2结构体访问优化后// IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 0x05;// IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 0x10B0;// GPIO1-GDIR | (1 3); }3LED 控制亮、灭、闪烁 通过操作 GPIO1 的 DR 寄存器数据寄存器控制引脚电平 LED灯亮对应位写 0拉低电平假设 LED 为共阳极LED灯灭对应位写 1拉高电平LED灯闪烁对应位异或电平翻转 // LED点亮 void led_on(void) {GPIO1-DR ~(1 3); // 第3位清0拉低电平 }// LED熄灭 void led_off(void) {GPIO1-DR | (1 3); // 第3位置1拉高电平 }// LED闪烁电平翻转 void led_flicker(void) {GPIO1-DR ^ (1 3); // 第3位异或0变11变0 }// 延时函数软件延时时间与参数time相关 void led_delay(unsigned int time) {while (time--); }二、SDK 库文件 1. SDK文件选择 SDKSoftware Development KitNXP 提供的 I.MX6ULL 开发工具包包含完整 IDE需额外设备下载器、仿真器和底层驱动头文件移植核心仅使用 SDK 中的头文件无需完整 IDE路径为IMAX6ULL/SDK/关键头文件包括 cc.h时钟相关定义core_ca7.hARM Cortex-A7 内核相关定义fsl_common.h通用工具函数定义fsl_iomuxc.h引脚复用配置函数定义MCIMX6Y2.hI.MX6ULL 寄存器映射结构体定义。 2. 基于 SDK 的点灯程序优化 SDK 提供了封装好的引脚配置函数如IOMUXC_SetPinMux、IOMUXC_SetPinConfig简化寄存器操作 // 时钟初始化SDK中CCM已封装为结构体可通过CCM-CCGRx访问 void clock_init(void) {CCM-CCGR0 0xFFFFFFFF;CCM-CCGR1 0xFFFFFFFF;CCM-CCGR2 0xFFFFFFFF;CCM-CCGR3 0xFFFFFFFF;CCM-CCGR4 0xFFFFFFFF;CCM-CCGR5 0xFFFFFFFF;CCM-CCGR6 0xFFFFFFFF; }// LED初始化有SDK void led_init(void) {// 1. 引脚复用将GPIO1_IO03配置为GPIO功能第2个参数为ALT引脚0表示无ALTIOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0);// 2. 引脚电气属性配置驱动能力、上下拉等0x10B0为标准配置IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0x10B0);// 3. GPIO方向配置设为输出GPIO1-GDIR | (1 3); }注意 时钟使能I.MX6ULL外设时钟默认关闭初始化外设前必须开启对应时钟门; 三、BSP 工程管理与构建 1. 工程目录结构模块化管理 将代码按功能拆分到不同目录提高可维护性目录结构如下 2. 蜂鸣器实现S8550 PNP 三极管 原理S8550 为 PNP 型三极管基极高电平时导通控制蜂鸣器发声核心代码与 LED 驱动逻辑类似仅需修改对应引脚 //beep.h#ifndef _BEEP_H_ #define _BEEP_H_extern void beep_init(void); extern void beep_on(void); extern void beep_off(void); extern void beep_nor(void);#endif//beep.c#include beep.h #include fsl_iomuxc.h #include MCIMX6Y2.hvoid beep_init(void) {IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01 , 0); //复用功能IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01 , 0x10B0); //电气特性 GPIO5-GDIR | (1 1); //引脚方向配置beep_off(); }void beep_on(void) //蜂鸣器发声 {GPIO5-DR ~(1 1); //置0 }void beep_off(void) //蜂鸣器停止发声 {GPIO5-DR | (1 1); //置1 }void beep_nor(void) //蜂鸣器交替发声 {GPIO5-DR ^ (1 1); }//main.c 实现LED灯和蜂鸣器的共同操作#include fsl_iomuxc.h #include MCIMX6Y2.h #include led.h #include beep.hvoid clock_init(void) {CCM-CCGR0 0xFFFFFFFF;CCM-CCGR1 0xFFFFFFFF;CCM-CCGR2 0xFFFFFFFF;CCM-CCGR3 0xFFFFFFFF;CCM-CCGR4 0xFFFFFFFF;CCM-CCGR5 0xFFFFFFFF;CCM-CCGR6 0xFFFFFFFF; }void led_delay(unsigned int t) {while(t--); }int main(void) {clock_init();led_init();beep_init();while (1){led_nor();beep_nor();led_delay(0x7FFFF);} } 3. Makefile 优化多目录编译 支持多目录project、bsp/led、bsp/beep编译自动生成目标文件obj 目录并通过链接脚本生成 bin、elf、dis 文件 target led// 定义交叉编译器前缀 cross_compiler arm-linux-gnueabihf-// 定义编译工具 cc $(cross_compiler)gcc // 编译器 ld $(cross_compiler)ld // 链接器 objcopy $(cross_compiler)objcopy // 格式转换工具 objdump $(cross_compiler)objdump // 反汇编工具// 头文件和源文件目录 incdirs bsp imx6ull // 头文件搜索目录 srcdirs bsp project // 源文件搜索目录// 生成头文件包含参数 include $(patsubst %, -I%, $(incdirs))// 查找所有C和汇编源文件 cfiles $(foreach dir, $(srcdirs), $(wildcard $(dir)/*.c)) sfiles $(foreach dir, $(srcdirs), $(wildcard $(dir)/*.S))// 处理文件名去路径 cfilenodir $(notdir $(cfiles)) sfilenodir $(notdir $(sfiles))// 生成目标文件路径 cobjs $(patsubst %, obj/%, $(cfilenodir:.c.o)) // C文件对应的.o sobjs $(patsubst %, obj/%, $(sfilenodir:.S.o)) // 汇编文件对应的.o objs $(cobjs) $(sobjs) // 所有目标文件// 源文件搜索路径 VPATH $(srcdirs)// 生成bin文件依赖所有目标文件 $(target).bin : $(objs)$(ld) -Timx6ull.lds -o$(target).elf $^ // 链接生成elf$(objcopy) -O binary -S -g $(target).elf $ // 转换为bin$(objdump) -D $(target).elf $(target).dis // 生成反汇编// 汇编文件编译规则 $(sobjs) : obj/%.o : %.Smkdir -p obj$(cc) -Wall -nostdlib -c $(include) -o $ $// C文件编译规则 $(cobjs) : obj/%.o : %.cmkdir -p obj $(cc) -Wall -nostdlib -c $(include) -o $ $// 清理编译产物 .PHONY : clean clean:rm -rf $(objs) $(target).elf $(target).bin $(target).dis// 下载程序到SD卡 load:../imxdownload $(target).bin /dev/sdb 总结 工具前缀为arm-linux-gnueabihf-作用gcc编译器将源代码.c/.S编译为目标文件.o预处理→编译→汇编生成机器码ld链接器按链接脚本将多个目标文件.o合并为可执行文件.elfobjcopy目标文件拷贝工具将.elf 文件转换为二进制文件.bin便于烧写至开发板 Flash/RAMobjdump目标文件反汇编工具对.elf 文件反汇编生成.dis 文件用于调试查看指令与地址对应关系辅助工具如imxdownload专用烧写工具将.bin 文件烧写到开发板存储设备如 SD 卡 /dev/sdb 4. 链接脚本imx6ull.lds 指定代码加载地址I.MX6ULL 常用 0x87800000定义各段text、rodata、data、bss的排列顺序并标记 BSS 段起始 / 结束地址用于启动文件初始化 BSS 段 SECTIONS {. 0x87800000; // 代码加载基地址I.MX6ULL DDR起始地址// 代码段text存放启动文件、主程序代码.text :{obj/start.o // 启动文件优先加载需先初始化栈、BSS段*(._text) // 所有文件的text段} // 只读数据段rodata存放常量4字节对齐.rodata ALIGN(4) : {*(.rodata*)}// 已初始化数据段data存放初始化过的全局变量4字节对齐.data ALIGN(4) : {*(.data)}// 未初始化数据段bss存放未初始化的全局变量需在启动文件中清0__bss_start .; // BSS段起始地址.bss ALIGN(4) : {*(.bss) *(COMMON)} // 所有bss段和COMMON段__bss_end .; // BSS段结束地址 } 注意 需要在启动代码中加入跳转链接 BSS 段初始化启动文件start.S需在跳转到 main 前将__bss_start到__bss_end的内存清0 1.链接脚本的作用 链接脚本上文中的imx6ull.lds的核心作用是定义程序的内存布局使链接器将多个目标文件.o合并为可执行文件.elf 的配置文件核心是定义 “内存布局” 和 “段的排列规则”不同段对应程序中不同类型的数据确保代码和数据加载到芯片指定的内存地址如上文中的-Ttext 0x87800000达成硬件成功运行的要求 2.各段及存储数据类型 常见段名存储数据类型.text代码段存放可执行指令如 C 函数、汇编指令只读.data数据段存放已初始化且非零的全局变量 / 静态变量可读可写.bss未初始化数据段存放未初始化或初始化为零的全局变量 / 静态变量运行时由系统清零.rodata只读数据段存放只读常量如字符串常量、const修饰的全局变量.stack栈区用于函数调用时保存局部变量、函数参数、返回地址由编译器自动管理.heap堆区用于动态内存分配如malloc申请的内存需手动管理
http://www.zqtcl.cn/news/848425/

相关文章:

  • 网站文章伪原创怎么做手机网站 程序
  • 网站建设每月工作多少开发小程序的目的
  • 社区网站建设方案pptwordpress用户名在哪看
  • 浙江企业响应式网站建设公司简介如何写
  • 自己做静态网站的步骤店面设计在线
  • 活动汪活动策划网站wordpress 无法保存
  • 门户网站开发案例兰州需要做网站的公司有哪些
  • 东莞企业网站asp网站怎么安装
  • 个人做公司网站网站备案取消接入
  • 崇信网站建设it外包的收益主要有哪些
  • 安陆做网站多少钱免费网站定制
  • 快递网站模版长春好的做网站公司有哪些
  • 怎么利用公司网站开发客户网站建设重点步骤
  • 网站站内推广用个人电脑做网站的步骤
  • 网站设计主要包含3个方面陕西城乡住房建设部网站
  • 专门做汽车配件的网站东莞招聘网有哪些比较好
  • 网站前台怎么套用织梦后台小网站怎么建设
  • 网站框架代码深圳手机网站设计
  • 更改网站主题九江建网站的公司
  • 如何分析一个网站网站页面建设
  • 做网站好网页制作3个网页的网站图片
  • 合肥网站建设网站推广新的网站建设一般多少钱
  • 北京网站改版哪家好网站关键词怎样做优化
  • 网站开发行业分析wordpress 粘贴表格
  • 网站开发的招标参数网络科技公司网站源码下载
  • 属于网络营销站点推广的是seo好wordpress主题
  • j2ee只做网站阿里企业邮箱免费
  • 做企业网站需要买什么资料室内设计学徒
  • 网站新增关键词设计公司logo公司文化
  • 怎么写一个网站程序农产品网站如何做地推