【ARM】Tiny4412裸板编程之静态库(libc.a)

00. 目录

01. 开发环境

  • 开发板:Tiny4412SDK标准版 「Tiny4412 SDK 1506」
  • 工具:「arm-linux-gcc-4.5.1」 「minicom」 「dnw」
  • 平台:Ubuntu 20.04

02. 概述

libc是Linux下的ANSI C的函数库。html

ANSI C是基本的C语言函数库,包含了C语言最基本的库函数。这个库能够根据 头文件划分为 15 个部分,其中包括:字符类型 ()、错误码()、 浮点常数 ()、数学常数 ()、标准定义 ()、 标准 I/O ()、工具函数 ()、字符串操做 ()、 时间和日期 ()、可变参数表 ()、信号 ()、 非局部跳转 ()、本地信息 ()、程序断言 () 等等。这在其余的C语言的IDE中都是有的。linux

03. 库的来源

libc.a在ARM平台中通常在交叉编译对应的目录中web

/usr/local/arm/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib/libc.a

04. 程序示例一

test.c文件shell

#include <string.h>

int ar[100];

int (*print)(const char *format, ...) = (void*)0x43e11a2c;

int sum = 0;

extern unsigned int __bss_start;
extern unsigned int __bss_end;


int main(void)
{
    int i = 0;

    //memset((void*)&__bss_start, 0, (int)&__bss_end - (int)&__bss_start);

     for (i = 0; i < 10; i++)
     {
            print("ar[%d] = %d\n", i, ar[i]); 
     }

     print("sum = %d\n", sum);

    return 0;
}

start.lds文件app

ENTRY(_start);
OUTPUT("test");
OUTPUT_ARCH(arm);

SECTIONS
{
    . = 0x40000000;
    .text : {
        start.o(.text);
        *(.text);   
    }

    .rodata : {
        *(.rodata);
    }

    . = ALIGN(4);
    .data : {
        *(.data);
    }

    . = ALIGN(4);
    __bss_start = .;
    .bss : {
        *(.bss);
    }
    __bss_end = .;
}

Makefile文件svg

CROSS_COMPILE = arm-linux-
CC = $(CROSS_COMPILE)gcc
CC_FLAGS = -c -I ./
LD = $(CROSS_COMPILE)ld
LD_FLAGS = -T start.lds -Ttext 0x40008000
OBJCOPY = $(CROSS_COMPILE)objcopy
COPY_FLAGS = -O binary
OBJDUMP=$(CROSS_COMPILE)objdump
DUMP_FLAGS=-D
TARGET=test
LIBS=lib/libc.a
OBJS=start.o led.o lib.o test.o bell.o key.o

all: $(OBJS)
	$(LD) $(LD_FLAGS) $(OBJS) $(LIBS) -o $(TARGET)
	$(OBJCOPY) $(COPY_FLAGS) $(TARGET) $(TARGET).bin
	$(OBJDUMP) $(DUMP_FLAGS) $(TARGET) > $(TARGET).dis
	rm -rf *.o

%.o:%.s
	$(CC) $(CC_FLAGS) $<
%.o:%.S
	$(CC) $(CC_FLAGS) $<
%.o:%.c
	$(CC) $(CC_FLAGS) $<

.PHONY:clean
clean:
	rm -rf *.o $(TARGET).bin $(TARGET).dis $(TARGET)

测试结果函数

## Starting application at 0x40008000 ...
ar[0] = 0
ar[1] = -509595648
ar[2] = -481165304
ar[3] = 973078545
ar[4] = -485294077
ar[5] = 348327937
ar[6] = 306323457
ar[7] = 452984827
ar[8] = -503246593
ar[9] = -511634431
sum = -202655882
## Application terminated, rc = 0x0

05. 程序示例二

test.c文件内容工具

#include <string.h>

int ar[100];

int (*print)(const char *format, ...) = (void*)0x43e11a2c;

int sum = 0;

extern unsigned int __bss_start;
extern unsigned int __bss_end;


int main(void)
{
    int i = 0;

    memset((void*)&__bss_start, 0, (int)&__bss_end - (int)&__bss_start);

     for (i = 0; i < 10; i++)
     {
            print("ar[%d] = %d\n", i, ar[i]); 
     }

     print("sum = %d\n", sum);

    return 0;
}

执行结果测试

## Starting application at 0x40008000 ...
ar[0] = 0
ar[1] = 0
ar[2] = 0
ar[3] = 0
ar[4] = 0
ar[5] = 0
ar[6] = 0
ar[7] = 0
ar[8] = 0
ar[9] = 0
sum = 0
## Application terminated, rc = 0x0
DengJin # 

06. 附录

6.1 Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdfspa

6.2 官方参考: http://www.delorie.com/djgpp/doc/libc/libc_1.html