嵌入式Linux入门-点灯要关注更底层的东西

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式Linux入门-点灯要关注更底层的东西相关的知识,希望对你有一定的参考价值。

点灯可以说是每个嵌入式(单片机)开发者入门第一课了,很多习惯IDE开发,或者太关注更底层的朋友,上来就是个main函数。

今天从启动代码开始,真正从0开始点个灯。对于初学者,可能会有些许不明白的地方,没关系,先有个整体概念,更细的今后将会再次深入。

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

以经典的的SOC:S3C2440,ARM架构为例。

​更多内容,请关注公众号:大叔的嵌入式小站​

一、启动代码

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

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

只点灯涉及到的东西很少,这篇文章中的启动代码只需要设置栈,跳转main

.text
.global _start
_start:
//初始化堆栈
LDR SP,=4096
//NOR启动 LDR SP,=0x40000000+4096
//跳转至main
BL main
//无限循环
halt:
B halt

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

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

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

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

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

如图:

嵌入式Linux入门-点灯要关注更底层的东西_linux

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

二、C代码(开始点灯)

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

1.配置相应控制寄存器

2.设置相应数据寄存器

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

嵌入式Linux入门-点灯要关注更底层的东西_linux_02

看原理图

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

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

嵌入式Linux入门-点灯要关注更底层的东西_启动代码_03

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

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

嵌入式Linux入门-点灯要关注更底层的东西_启动代码_04

 于是代码就出来了

#include <stdio.h>
int main()

//设置IO为输出,设置IO对应引脚为低电平,GPF4
unsigned int *GPFCON,*GPFDAT;
GPFCON = 0x56000050;
GPFDAT = 0x56000054;
*GPFCON = 0x00000100;
*GPFDAT = 0;
return 0;


三、Makefile

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

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

all:
arm-linux-gcc -c -o led.o led.c
arm-linux-gcc -c -o start.o start.S
arm-linux-ld -Ttext 0 start.o led.o -o led.elf
arm-linux-objcopy -O binary -S led.elf led.bin
clean:
rm *.bin *.o *.elf

这个makefile非常简单,初学的朋友可以自行搜索,也可以点阅读原文到我的csdn查找,今后也会写更多的文章讲解。

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

烧到板子上,灯就亮了。

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

​更多内容,请关注公众号:大叔的嵌入式小站​


以上是关于嵌入式Linux入门-点灯要关注更底层的东西的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式开发 | 51STM32Linux点灯的区别

如何在单片机中用汇编优雅的点灯

嵌入式软件设计(库函数调用实现点灯)

嵌入式开发入门到放弃的关键时刻

实用 | 10分钟教你通过网页点灯

一叶知秋,一个 LED 就能入门 Linux 内核