• 嵌入式Linux入门-从启动代码开始,真正从0开始点个灯


    很多没有接触过嵌入式的,或者习惯IDE开发的朋友,上来就是个main函数,今天从启动代码开始,真正从0开始点个灯。

    嵌入式Linux学习系列全部文章:嵌入式Linux学习—从裸机到应用教程大全

    板子和芯片无所谓,其实都差不多,会看手册,看原理图都一样

    我所用板子的SOC:S3C2440,ARM架构

    一、启动代码

    启动代码为一段汇编语言所写的代码,

    主要作用为关看门狗,设置栈,设置时钟,跳转main函数执行等。

    这篇文章中的启动代码只需要设置栈跳转main

    1. .text
    2. .global _start
    3. _start:
    4. //初始化堆栈
    5. LDR SP,=4096
    6. //NOR启动 LDR SP,=0x40000000+4096
    7. //跳转至main
    8. BL main
    9. //无限循环
    10. halt:
    11. B halt

    看不懂汇编的可以先看http://t.csdn.cn/bNpxd 

    http://t.csdn.cn/tpM6F这两篇文章

    这里简单说一下,.text代表代码段,.global声明全局变量,_start标号就是真正启动开始的地方

    LDR SP,=4096伪指令,设置栈的地址(Nand启动)

    如果不是从Nand启动则LDR SP,=0x40000000+4096

    我是如何知道这个栈地址的?

    看芯片手册,找到memory controller那一章就有说明

    如图:f44d925812f24df6be45ce1960e4e833.png

     代码复制到片内SRAM执行,片内SRAM大小为4KB,将栈设置到片内SRAM顶端。

    二、C代码(开始点灯)

    学过单片机的朋友可能知道,想要实现某个功能无非就是

    1.配置相应控制寄存器

    2.设置相应数据寄存器

    我想让我板子上的LED灯亮,得先找到LED连接的引脚

    看原理图0f3dc3d134184df98ebb3e5231530769.png

     我想让这个LED_1亮,根据原理图配置相应引脚为输出,电平为低电平就行。

    继续看连到了芯片上的哪一个引脚(IO端口)。

    2e0e029cbadb442cb2083d03558cff2d.png

     看了原理图,发现原来是GPF4

    查芯片手册,看看GPF4要怎么配置

    cdbfbbe2a3cb45b1a17a32bb45584891.png

     于是代码就出来了

    1. #include
    2. int main()
    3. {
    4. //设置IO为输出,设置IO对应引脚为低电平,GPF4
    5. unsigned int *GPFCON,*GPFDAT;
    6. GPFCON = 0x56000050;
    7. GPFDAT = 0x56000054;
    8. *GPFCON = 0x00000100;
    9. *GPFDAT = 0;
    10. return 0;
    11. }

    三、Makefile

    我们得让启动代码start.S和C代码连接起来,

    可以手动先编译,再链接,但是真实开发过程往往很多bug,老是输入编译,链接命令很麻烦,所以写个Makefile。

    1. all:
    2. arm-linux-gcc -c -o led.o led.c
    3. arm-linux-gcc -c -o start.o start.S
    4. arm-linux-ld -Ttext 0 start.o led.o -o led.elf
    5. arm-linux-objcopy -O binary -S led.elf led.bin
    6. clean:
    7. rm *.bin *.o *.elf

    不会写Makefile的朋友可以翻一翻我的文章。

    然后一个make命令就得到了二进制文件led.bin

    烧到板子上,灯就亮了。

    这就是从启动代码开始的全部过程。

     

  • 相关阅读:
    FPGA NVMe SSD SQ
    SpringBoot 前后端分离 实现验证码操作
    Go语言接口
    php使用jwt作登录验证
    【JVM】jvm的类加载机制
    Linux内存管理(三十一):页面回收总结
    SQL映射XML文件
    北方直播卖货搞钱“第一城“,竟然是临沂,200万人发家快手电商
    macOS 中 聚焦搜索 的使用教程
    【0119】PostgreSQL FMS(Free Space Map)
  • 原文地址:https://blog.csdn.net/freestep96/article/details/126473076