[smart210] firstled.s 代码分析及编译分析

发布者:Joyful444Life最新更新时间:2024-12-12 来源: cnblogs关键字:smart210 手机看文章 扫描二维码
随时随地手机看文章

平台:smart210(tiny210v2)

CPU:S5PV210


目标:led灯按照一定频率闪烁


1.代码如下(如果不能编译,请去掉注释):


.globl _start


_start:

    ldr r1, =0xE0200280     //config the GPJ2CON[0to15] as output

    ldr r0, =0x00001111        

    str r0, [r1]

    mov r2, #0x1000          //r2=8

led_blink:

     ldr r1, =0xE0200284    //set the GPJ2DAT[0to3] as 0,4 leds would light on!

     mov r0, #0xa                

     str r0, [r1]


     bl delay


     ldr r1, =0xE0200284    //set the GPJ2DAT[0to3] as 1,4 leds would light off!

     mov r0, #0x5 

     str r0, [r1]


     bl delay


     sub r2,r2,#1        //r2=r2-1

     cmp r2,#0            //if r2!=0 jump to led_blink

     bne led_blink        //then the led_blink will turn 8 times


halt:

    b halt            //while(1)


delay:

    mov r0,#0xf000000        //r0=0xf000000

delay_loop:

    cmp r0,#0            //if r0=0

    sub r0,r0,#1        //r0=r0-1

    bne delay_loop        //after 'cmp r0,#0' ,if r0!=0 jump to delay_loop 

                //then the delay_loop will turn 32 times

    mov pc,lr            //come back the main


2.使用以下命令编译链接与反汇编


arm-linux-gcc -c -o firstled.o firstled.s    //对.s文件进行预处理,编译,汇编,生成.o文件

arm-linux-ld -Ttext 0x0 -o led.elf firstled.o    //链接.o文件,并设置代码段起始运行地址为0x0 ,生成.elf

arm-linux-objcopy -O binary led.elf led.bin    //将.elf文件复制一份,并以二进制.bin形式保存,该形式可在开发板上使用

arm-linux-objdump -D led.elf > led_elf.dis    //将.elf文件反汇编成.dis文件,方便调试程序

3.使用以下命令给led.bin添加头部


./mkmini210 led.bin led210.bin

其中,mkmini210由程序mkv210_image.c编译而来,mkv210_image.c内容如下


/* 在BL0阶段,Irom内固化的代码读取nandflash或SD卡前16K的内容,

 * 并比对前16字节中的校验和是否正确,正确则继续,错误则停止。*/

#include

#include

#include


#define BUFSIZE                 (16*1024)

#define IMG_SIZE                (16*1024)

#define SPL_HEADER_SIZE         16

#define SPL_HEADER              'S5PC110 HEADER  '


int main (int argc, char *argv[])

{

    FILE        *fp;

    char        *Buf, *a;

    int        BufLen;

    int        nbytes, fileLen;

    unsigned int    checksum, count;

    int        i;

    

    // 1. 3个参数

    if (argc != 3)

    {

        printf('Usage: mkbl1 n');

        return -1;

    }


    // 2. 分配16K的buffer

    BufLen = BUFSIZE;

    Buf = (char *)malloc(BufLen);

    if (!Buf)

    {

        printf('Alloc buffer failed!n');

        return -1;

    }


    memset(Buf, 0x00, BufLen);


    // 3. 读源bin到buffer

    // 3.1 打开源bin

    fp = fopen(argv[1], 'rb');

    if( fp == NULL)

    {

        printf('source file open errorn');

        free(Buf);

        return -1;

    }

    // 3.2 获取源bin长度

    fseek(fp, 0L, SEEK_END);

    fileLen = ftell(fp);

    fseek(fp, 0L, SEEK_SET);

    // 3.3 源bin长度不得超过16K-16byte

    count = (fileLen < (IMG_SIZE - SPL_HEADER_SIZE))

        ? fileLen : (IMG_SIZE - SPL_HEADER_SIZE);

    // 3.4 buffer[0~15]存放'S5PC110 HEADER  '

    memcpy(&Buf[0], SPL_HEADER, SPL_HEADER_SIZE);

    // 3.5 读源bin到buffer[16]

    nbytes = fread(Buf + SPL_HEADER_SIZE, 1, count, fp);

    if ( nbytes != count )

    {

        printf('source file read errorn');

        free(Buf);

        fclose(fp);

        return -1;

    }

    fclose(fp);


    // 4. 计算校验和

     // 4.1 从第16byte开始统计buffer中共有几个1

    a = Buf + SPL_HEADER_SIZE;

    for(i = 0, checksum = 0; i < IMG_SIZE - SPL_HEADER_SIZE; i++)

        checksum += (0x000000FF) & *a++;

    // 4.2 将校验和保存在buffer[8~15]

    a = Buf + 8;

    *( (unsigned int *)a ) = checksum;


    // 5. 拷贝buffer中的内容到目的bin

    // 5.1 打开目的bin

    fp = fopen(argv[2], 'wb');

    if (fp == NULL)

    {

        printf('destination file open errorn');

        free(Buf);

        return -1;

    }

    // 5.2 将16k的buffer拷贝到目的bin中

    a = Buf;

    nbytes    = fwrite( a, 1, BufLen, fp);

    if ( nbytes != BufLen )

    {

        printf('destination file write errorn');

        free(Buf);

        fclose(fp);

        return -1;

    }


    free(Buf);

    fclose(fp);


    return 0;

}


这段代码完成的工作是:


第一步 分配16k 的buffer;

第二步 将led.bin 读到buffer的第16byte开始的地方;

第三步 计算校验和,并将校验和保存在buffer第8~11byte中;

第四步 将16k 的buffer拷贝到led210.bin 中;


4.下载led210.bin到smart210


这里使用minitools下载.bin文件,操作过程比较简单就不再赘述了


5.运行效果是4个LED交替闪烁,频率约为0.8s左右


关键字:smart210 引用地址:[smart210] firstled.s 代码分析及编译分析

上一篇:[smart210] 通过PLL设置各时钟频率的方法以及代码注释
下一篇:s5pv210 I2C通信详解

推荐阅读最新更新时间:2026-02-18 12:23

04-S3C2440u-boot学习之u-boot分析(1)编译体验
U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。U-Boot的作用是系统引导。 U-Boot从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。 程序执行流程: (1)一上电,运行bootloader (2)读出内核,启动内核--最主要目的 (3)挂接根文件系统,运行里面应用程序 (1)使用 linux-2.6.22.6_jz2440.patch给linux
[单片机]
04-<font color='red'>S</font>3C2440u-boot学习之u-boot<font color='red'>分析</font>(1)<font color='red'>编译</font>体验
Smart210学习记录-------文件操作
一.linux文件操作(只能在linux系统上用) 创建: int creat(const char* filename, mode_t mode) filename 表示要创建的文件名,mode表示对该文件的读写权限 int umask(int newmask) 调用将 umask 设置为 newmask,然后返回旧的 umask,它只影响读、写和执行权限 S_IRUSR 用户可以读 S_IWUSR 用户可以写 S_IXUSR 用户可以执行 。。。等等 除了可以通过上述宏进行“或”逻辑产生标志以外,我们也可以自己用数字来表示,Linux 用 5 个数字来表示文件的各种权限:第一位表示设置用户 ID;第二位表示设置组 ID;第三位
[单片机]
Smart210学习记录----beep linux字符设备驱动
今天搞定了beep linux字符设备驱动,心里还是很开心的,哈哈。。。但在完成的过程中却遇到了一个非常棘手的问题,花费了我大量的时间,,,, 还是把问题描述一下吧,好像这个问题很普遍的,网上许多解决方法,但是我还是没看懂,只能慢慢找,,, 我在insmod字符设备是,出现了一下提示信息 这里只列出主要部分: Unable to handle kernel NULL pointer dereference at virtual address 00000000 pgd = c0004000 *pgd=00000000 Internal error: Oops: 7 Modules lin
[单片机]
Smart210 USB ROOT HUB自动复位
现象: 使用usb camera 在lcd上显示图像时,偶尔发生USB ROOT HUB reset, 导致camera停止工作,然后发生usb camera自动断开,然后又重新识别,断开又识别。 如果不使用usb camera,就不会发生 usb reset。 分析: 1、怀疑USB供电问题,导致usb不稳定,但是,使用带外接电源的usb,没有任何改善; 2、分析log,是usb异常中断导致,但是仍然无法判断异常的来源; 3、怀疑是驱动问题,更换linux 内核版本,3.4.2、3.7、3.9.7、3.10、3.13几个版本都有同样问题; 4、使用官方kernel 3.0.8就没有问题,确认还是驱动配置问题。但是仍然找不到
[单片机]
GCC编译器原理(三)------编译原理三:编译过程(2-2)---编译之语法分析
2.2 语法分析 语法分析器(Grammar Parser)将对由扫描器产生的记号进行语法分析,从而产生语法树(Syntax Tree)。整个分析过程采用了上下文无关语法(Context-free Grammar)的分析手段。 由语法分析器生成的语法树就是以表达式(Expression)为节点的树。如下所示: 从图中可以知道,整个语句就是一个赋值表达式:赋值表达式的左边是一个数组表达式,右边是一个乘法表达式;数组表达式又由两个符号表达式组成,等等。符号和数字是最小的表达式,它们不是由其他表达式来组成,所以它们通常作为整个语法树的叶节点。 在语法分析的同时,很多运算符号的优先级和含义也被确定下来了。比如乘法表达式比加法表
[单片机]
GCC<font color='red'>编译</font>器原理(三)------<font color='red'>编译</font>原理三:<font color='red'>编译</font>过程(2-2)---<font color='red'>编译</font>之语法<font color='red'>分析</font>
Freestanding C与交叉编译器的生成原理分析
0 问题由来 以前也用过C51写过简单的裸机程序,但是并没有认真的考虑过其与Linux环境下一般C语言程序的不同,只是想当然地认为C是跨平台的语言,并没有考虑过C语言的标准问题。 今天在编译GCC交叉编译器时,遇到了种种问题,不得不重新考虑C语言的实现标准,否则很难清晰的了解交叉编译器的编译过程。 1 C编译器的两种实现要求 C语言标准的正式文档中明确提出了C编译器的两种实现标准: 1.1 conforming freestanding implementation 所谓的Freestanding,C编译器只需提供C语言语句的编译,外加 float.h limits.h stdarg.h stdint.h
[单片机]
1_5.3.1_内核配置裁剪及启动流程_内核启动流程分析编译
使用linux-2.6.22.6版本,补丁为官方提供的2440补丁。 解压缩:tar -jxvf linux-2.6.22.6.tar.bz2 打补丁:patch -p? 补丁文件 配置 编译 其中,配置主要有三种方法: make menuconfig,自己手动配置(太复杂); 使用默认配置,在上面修改; 使用厂家提供的配置; 使用默认配置的话,默认配置是什么呢?在arch/arm/configs目录下,找到相似的配置文件xxx_defconfig,然后执行make xxx_defconfig(结果保存在.config),执行make menuconfig(从.config中读取)配置。 使用厂家提供的配置文件时,
[单片机]
1_5.3.1_内核配置裁剪及启动流程_内核启动流程<font color='red'>分析</font>之<font color='red'>编译</font>
魅族前高管李楠分析华为开源方舟编译器之影响
在8月31日华为的方舟编译器正式开源,而华为此举对它本身与谷歌有何影响呢?就此问题,魅族前高级副总裁李楠在知乎进行了回答。 李楠认为华为目前抛出的所有技术方案,其实都可以看作下一代解决方案。这种做法的聪明之处是,即可以用与众不同的技术手段加强和 android的区别,又可以随时拿来为不完善辩护。 所以这更像是一个准备貌似有点匆忙的长期威慑。但是因为开源的优越性与不完善的弱点,准备匆忙也无所谓吧。 在李楠看来国内市场,才是华为与谷歌谈判最后和最可靠的筹码,而非任何技术方案,最恶劣的情况下,新兴市场加一带一路国家,谷歌服务变得没有那么必要,使得华为有争取的机会,至于北美和西欧,华为可以选择放弃。 而技术封锁,不可能搞死任何有能力的
[手机便携]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved