imx6ull 2 led driver via c

  • 一、C语言运行环境搭建
    1、设置处理器模式
    cortex-a有9种模式,设置imx6ull处于svc模式(超级管理员模式 / 特权模式,可访问cpu所有资源)下。
    设置svc模式需要 设置CPSR寄存器的bit4 - 0 为0x13。
    读写程序状态寄存器需要用到MRS和MSR指令,用来对CPSR(特殊寄存器)读和写
    的撒
    2、设置SP指针
    sp可以指向内部ram,也可以指向ddr(外部ram),我们选择ddr。
    sp设置到哪里?ddr的size为512mb,0x8000 0000 - 0x9fff ffff。
    栈大小:这里我们自主设置为0x20 0000 = 2mb
    处理器的栈增长方式:对于a7,是高地址向低地址
    设置sp指向 0x8020 0000
    3、如何从汇编跳到c语言
    stm32的汇编启动文件中,调用 __main 这个库函数,在这个库函数里面会调用 main 函数
    imx6ull中,直接使用b指令,b main。跳转到c语言函数(main函数)。

二、软件编写
makefile
本次makefile中编译需要加上 -nostdlib 选项。
作用:不连接系统标准启动文件标准库文件,只把指定的文件传递给链接器。这个选项常用于编译内核、bootloader等程序,它们不需要启动文件、标准库文件。C语言程序执行的第一条指令不是main函数。生成一个C程序的可执行文件时编译器通常会在我们的代码上加上几个被称为启动文件的代码文件:crt1.o,crti.o,crtend.o,crtn.o等,他们是标准库文件。这些代码设置C程序的堆栈等,然后调用main函数。他们依赖于操作系统,在裸板上无法执行。我们自己写的 start.s 中完成了这些工作。我们自己写的 start.s 汇编文件就是一个启动文件,它设置好堆栈后调用main函数。因此,我们不需要系统自带的启动文件。所以在main.c 和 main.h 里面都没有包 stdio.h
line 4:-S选项:不复制源文件中的符号信息和重定位信息
line 5:-D选项:反汇编所有的端,注意有个大于号,当成一个固定搭配。该行的源文件是led.elf。反汇编的源文件是ledc.elf
的撒

这里不能使用静态模式,因为依赖有.c文件,也有.s文件。用这个make的话会提示找不到start.c。所以在依赖全是.c或者.s的时候用静态模式不会冲突

dasd

三、链接脚本
链接脚本的主要目的是描述输入文件中的段如何被映射到输出文件中,并且控制输出文件中的内存排布
一般编译出来的代码包含四个段
text:代码段
data:数据段(会被初始化)
bss:数据段(未被初始化)
rodata:只读数据段

的撒
第二行对 “ . ” 进行赋值,这个点叫做定位计数器,默认值是0。
对定位计数器赋值 或者 把定位计数器的值赋给别的变量 ,在语句的末尾都要加上分号
第三行 “ .text ” 是段名,必须要空格,再加冒号
第六行表示中 * 是通配符,表示所有输入文件的 .text段都放到这个段里
第八行的 ALIGN(4)的意思是对.rodata段的这个起始地址做四字节对齐,使得该段的起始地址被4整除
第十行和第十二行中 .bss 段的起始地址结束地址都保存在了 __bss_start 和 __bss_end 中,由于这部分区域的变量未被初始化,一般需要我们手动清0,这两个标号__bss_start 和 __bss_end 在汇编和c里可以直接用
---------------------------------------------------------

  • 题外话:
    arm汇编注释符用@
    volatile变量
    限定词const告诉编译器“这是不会改变的”(这就是允许编译器执行额外的优化);
    限定词volatile则告诉编译器“不知道何时变化”,防止编译器依据变量的稳定性作任何优化
    强制类型转换:前面的类型一定要加括号括起来
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值