OK6410裸机学习之汇编调用C函数传参数

发布者:vettykatty最新更新时间:2018-10-11 来源: eefocus关键字:OK6410  裸机  汇编调用  传参数 手机看文章 扫描二维码
随时随地手机看文章

start.S汇编源码:

.globl _start

_start:

// 硬件相关的设置 

    // Peri port setup 

    ldr r0, =0x70000000

    orr r0, r0, #0x13

    mcr p15,0,r0,c15,c2,4       @ 256M(0x70000000-0x7fffffff)

    

// 关看门狗 

    // 往WTCON(0x7E004000)写0    

    ldr r0, =0x7E004000

    mov r1, #0

    str r1, [r0]

// 设置栈 

    ldr sp, =6*1024

    

    // int xxxxx(int start, int end, int a, int b, int c, int d) 

    mov r0, #0   // start 

    mov r1, #8   // end 

    mov r2, #0   // a 

    mov r3, #0   // b 

    

    // c, d 存在栈里 ,C函数的参数超过4个以后超过的部分存在栈里

    // 栈是向下增长的,数据入栈时SP指针先减再存入数据

    // 把sp栈顶的位置先减8,对于32位的单片机一个寄存器32位4个字节,减8可以存两个寄存器的值

    ldr sp, =6*1024-8;  

    mov r4, #0

    str r4, [sp]              // c 

    

    mov r4, #1

    str r4, [sp, #4]        // d ,把参数d的值r4存在sp+4的位置

    

    // 到此sp-8预留的空间已经存入了c、d两个参数

    bl xxxxx

halt:

    b halt    

=====================================================================

led.c源码:

void delay(int a, int b, int c, int d, int e, int f, int g, int h)

{

    volatile int i = a+b+c+d+e+f+g+h;

    while (i--);

}

int xxxxx(int start, int end, int a, int b, int c, int d)

{

    int i = start + a + b + c + d;

    

    volatile unsigned long *gpmcon = (volatile unsigned long *)0x7F008820;

    volatile unsigned long *gpmdat = (volatile unsigned long *)0x7F008824;

    

    // gpm0,1,2,3设为输出引脚 

    *gpmcon = 0x1111;

    

    while (1)

    {

        *gpmdat = i;

        i++;

        if (i == end)

            i = start;

        delay(0, 1, 2, 3, 4, 5, 6, 0x10000);

    }

    

    return 0;

}

=====================================================================

Makefile:

led.bin: start.o led.o

    arm-linux-ld -Ttext 0 -o led.elf start.o led.o

    arm-linux-objcopy -O binary led.elf led.bin

    arm-linux-objdump -D led.elf > led.dis

start.o : start.S

    arm-linux-gcc -o start.o start.S -c -O2

led.o : led.c

    arm-linux-gcc -o led.o led.c -c -O2

clean:

    rm *.o led.elf led.bin led.dis


关键字:OK6410  裸机  汇编调用  传参数 引用地址:OK6410裸机学习之汇编调用C函数传参数

上一篇:OK6410裸机学习之C语言调用汇编函数
下一篇:烧写OK6410裸板方法汇总

推荐阅读最新更新时间:2024-03-16 16:15

mini2440裸机编程-----IIC—读写AT24C08
开始弄2440的裸机编程,争取尽快从最底层把这些硬件都熟悉掌握。 最初始从配置裸机开发环境开始的,本来想用jlink+ADS来进行下载,结果用ADS的调试器AXD通过jlink进行下载的时候,软件总是出现各种问题,这个问题折腾了有10天的时间,浪费了很长时间,最后重装了系统,都没有搞定。最后决定还是通过ADS来编译,然后用supervivi来进行下载了。现在经常出现的问题是 usb下载器总是识别不到,而且有时会导致电脑重启,应该是友善之臂提供的usb的驱动的问题,这些问题经常导致我折腾很长时间,心情很沮丧。有碰到并解决了类似问题的同学可以给我留个言。闲话少叙。 最开始写了uart的驱动试验,然后做了iic和iis的试验。先
[单片机]
tiny4412裸机程序之位置无关码
在上篇文章中,将代码的.text、.data、.rodata段重定位到了0x02026400位置处去执行点亮LED的操作。但是,在链接脚本里指定的链接地址是0x02026400,那么为什么在重定位之前的代码能够在0x02023400地址处可以开始执行?就是因为前面使用的是位置无关码。写介绍介个概念: 链接地址:链接脚本里指定的,理论上程序运行时所处的地址。在编译时,编译器会根据链接地址来翻译位置有关码。 加载地址(运行地址):程序运行时,实际所处的地址。 位置无关码,位置有关码,是相对于一条指令的正常目的来说的。比如ldr r0, =xx,它的正常目的是取得标号处的地址,对于这个目的,它是位置有关码,运行的地址不对就获
[单片机]
tiny4412<font color='red'>裸机</font>程序之位置无关码
TX2440裸机时钟-PWM
一、定时器框图 S3c2440 有5 个16 位的定时器。由下面框图可知: 1、定时器0、1、2、3 有脉宽调制功能(PWM)。定时器4有一个没有输出引脚的内部定时器。定时器0 有一个用于大电流设备的死区生成器。 2、PCLK时钟首先经过8bit预分频器:定时器0 和1 共享一个8 位的预分频器,定时器2,3,4 共享另一个8 位预分频器 3、定时器时钟输入通道可选(通过MUX多选一开关): 1、内部时钟:经过预分频的1/2、1/4、1/8、1/16分频 2、外部时钟TLCK0 、TLCK1。 4、TCMPBn----定时器n比较缓冲寄存器 TCNTBn-----定时器n计数缓冲寄存器
[单片机]
TX2440<font color='red'>裸机</font>时钟-PWM
Exynos4412裸机开发 —— A/D转换器
一、Exynos4412 A/D转换器概述 1、简述 10位或12位CMOS再循环式模拟数字转换器,它具有10通道输入,并可将模拟量转换至10位或12位二进制数。5Mhz A/D 转换时钟时,最大1Msps的转换速度。A/D转换具备片上采样保持功能,同时也支持待机工作模式。 2、特性 ADC接口包括如下特性。 1)10bit/12bit输出位可选。 2)微分误差 1.0LSB。 3)积分误差 2.0LSB。 4)最大转换速率5Msps. 5) 功耗少,电压输入1.8V。 6)电压输入范围 0~1.8V。 7)支持偏上样本保持功能。 8)通用转换模式。 3、模块图 4412A/D转换器的控制器接口框图如下: 二、Ex
[单片机]
Exynos4412<font color='red'>裸机</font>开发 —— A/D转换器
tq2440JLink烧写裸机程序的问题
首先回顾一下编写裸机程序的步骤: 1 .使用ADS1.2创建工程,在DebugRel setting中的Language setting中要选中ARM920T,因为用的是S3C2440的CPU。ARM Linker中的起始地址是0x30000000,首先执行的文件为2440init.o,入口函数式init。 2 .添加所需要的文件到工程中,编写Main.c文件。当然入门的话只需要写这个文件就可以了。 3 .编译文件 4 .打开JLink,连接到开发板 5 .打开调试器AXD,下载编译好的axf文件到开发板上(文件在工程内的DebugRel文件夹下) 6 .运行。。。 但是在最后运行的时候却运行不起来,调
[单片机]
tq2440JLink烧写<font color='red'>裸机</font>程序的问题
TQ210裸机编程——按键点灯
今天来谈谈裸机编程的步骤: 1、 首先查看TQ210的底板原理图: 这次编程只操作KEY1和KEY2,在TQ210核心板原理图中搜索XEINT0 可以看出KEY1和KEY2分别接在S5PV210的GPH0_0和GPH0_1引脚。 这次编程使用查询法,需要设置这两个引脚为输入模式,然后循环读取引脚状态,当用户按下按键时,对应引脚为低电平,同时改变LED状态。 查看S5PV210芯片手册 由此,我们根据查询法,写出代码如下: #define GPC0CON *((volatile unsigned int *)0xE0200060) #define GPC0DAT *((volatile uns
[单片机]
TQ210<font color='red'>裸机</font>编程——按键点灯
裸机系列--s3c2400之LCD
平台:mini2440 编译工具:ads1.2 lcd型号:索尼3.5寸TFT液晶屏 开始lcd的驱动是在上个学期末,那时候快要期末了,要准备考试什么的,大概看了一下没看一下的,感觉学习效率很低,考试完后家里面要帮忙干农活,就回家呆了半个月,回到学校已经是8月份了,本来在回来后不久把lcd驱动了弄了一下,也准备总结一下的,但是后面的linux计划,也不知道是什么刺激 了我的神经,就感觉要加快进度学习了,后来拖着就到了今天,突然感觉这个学习要踏实,总结对于学习来说是非常重要的,有利于自己把知识归类,划分出重点,然后提高分析总结能力,同时总结的时候还能看到一些问题和不足。基于以上的一些原因,我还是继续在回顾一些裸机系列的最
[单片机]
S3C2416裸机开发系列十六_sd卡驱动实现
S3C2416裸机开发系列十六_sd卡驱动实现 标签: S3C2416 裸机开发 sd卡驱动 sd2.0 gcc 2014-05-26 12:56 2429人阅读 评论 (3) 收藏 举报 分类: s3c2416裸机开发(24) 版权声明:本文为博主原创文章,未经博主允许不得转载。 目录 (?) S3C2416裸机开发系列十六 sd卡驱动实现 象棋小子 1048272975 SD卡(Secure Digital Memory Card)具有体积小、容量大、数据传输快、可插拔、安全性好等优点,被广泛应用于便携式设备上。例如作为数码相机的存储卡,作为手机、平板多媒体扩展卡用的TF卡(micro sd)。笔者此
[单片机]
S3C2416<font color='red'>裸机</font>开发系列十六_sd卡驱动实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved