加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

如何在ubuntu下开发ARM裸机程序

发布时间:2016-09-07 08:29:25 所属栏目:Linux 来源:站长网
导读:在本文中,我们使用汇编跳转到C代码,来实现点亮led,其中注意的一点是sp的设置,其他就比较简单。 bootsect代码如下: @************************************

在本文中,我们使用汇编跳转到C代码,来实现点亮led,其中注意的一点是sp的设置,其他就比较简单。

bootsect代码如下:

@******************************************************************************  
@ File:bootsect.s  
@ 功能:  
@******************************************************************************  
.equ        WATCHDOGCON,    0x7e004000  
.equ        LEDCON,         0x7f008800  
.equ        LEDDAT,         0X7f008808  
      
.text  
.global _start  
_start:       
            bl      setup_peri_port  
            bl      disable_watch_dog  
            bl      setup_sp  
            bl      display_led  
      
            bl      main  
MAIN_LOOP:  
            b       MAIN_LOOP  
      
      
disable_watch_dog:  
            @往WATCHDOG寄存器写0即可  
            ldr r0,=WATCHDOGCON  
            mov r1,#0x0  
            str r1,[r0]  
            mov pc,lr  
          
setup_sp:  
            ldr sp, =1024*8         @ 设置堆栈,注意:不能大于8k, 因为现在可用的内存只有8K  
                                    @ nand flash中的代码在复位后会移到内部ram中,此ram只有8K  
            mov pc,lr  
      
setup_peri_port:  
            ldr r0,=0x70000013      @base addres:0x70000000,size:256MB  
            mcr p15,0,r0,c15,c2,4  
            mov pc,lr  
display_led:  
            ldr r0,=LEDCON          @ R0设为LEDCON,即GPKCON0寄存器。此寄存器  
                                    @ 用于选择端口K各引脚的功能:  
                                    @ 是输出、是输入、还是其他  
            mov r1,#0x110000          
            str r1,[r0]             @ 设置GPK4,5为输出口  
            ldr r0,=LEDDAT          @ R0设为GPKDAT寄存器。此寄存器  
                                     @ 用于读/写端口B各引脚的数据  
            mov r1,#0x00000000      @ 此值为0x000000,低电平点亮led  
            str r1,[r0]             @ GPK4,5输出0,LED4,5点亮  
            mov pc,lr

main.c文件如下:

#define rGPKCON0        (*(volatile unsigned *)(0x7F008800))  
#define rGPKCON1        (*(volatile unsigned *)(0x7F008804))  
#define rGPKDAT         (*(volatile unsigned *)(0x7F008808))  
#define rGPKPUD         (*(volatile unsigned *)(0x7F00880C))  
      
void Port_Init(void)  
{  
    rGPKCON0 = (rGPKCON0 & ~(0xffffU<<16))|(0x1111U<<16);  
    rGPKPUD  = (rGPKPUD  & ~(0xffU << 8))|(0x00U<<8);  
}  
      
void Led_Display(int data)  
{  
    rGPKDAT = (rGPKDAT & ~(0xf<<4)) | ((data & 0xf)<<4);  
}  
      
static void LedDelay(void)  
{  
        volatile unsigned int k;  
        for(k = 0; k < 200000; k++);  
}  
int main()  
{  
    Port_Init();      
    for(;;) {  
        Led_Display(0x1); //  
    LedDelay();  
        Led_Display(0x2); //   
    LedDelay();  
    Led_Display(0x4); //   
    LedDelay();  
    Led_Display(0x8); //   
    LedDelay();  
    }  
      
    return 0;  
}

Makefile文件如下:

led_on_c.bin : bootsect.s  main.c  
    arm-linux-gcc -g -c -o bootsect.o bootsect.s  
    arm-linux-gcc -g -c -o main.o main.c  
    arm-linux-ld -Ttext 0x0000000 -g  bootsect.o main.o -o linux_kernel_elf  
    arm-linux-objcopy -O binary -S linux_kernel_elf linux_kernel.bin  
    arm-linux-objdump -D -b binary -m arm  linux_kernel.bin > linux_kernel.dis  
clean:  
    rm -f *.dis *.bin *elf *.o

本栏目更多精彩内容:http://www.bianceng.cn/OS/Linux/

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读