icache_设置栈调用C函数_S5PV210

发布者:心想的45号最新更新时间:2024-12-20 来源: cnblogs关键字:icache  调用C函数  S5PV210 手机看文章 扫描二维码
随时随地手机看文章

start.S文件中:

//#define CONFIG_SYS_ICACHE_OFF  

.global _start

_start:
    // 关闭看门狗
    ldr    r0, =0xE2700000        //在s5pv210手册中0xE270_0000是看门狗寄存器的地址
    mov    r1, #0
    str    r1, [r0]

    // 打开icache可提高运行速度
#ifdef CONFIG_SYS_ICACHE_OFF
    // clear bit 12 (I) I-cache
    bic    r0, r0, #0x00001000        //bic:逻辑与非
                                    //在s3c2410英文手册中搜icache
                                    //找到REGISTER 0(r0),其中就有说明
                                    //或者直接搜REGISTER 0
#else
    // set bit 12 (I) I-cache
    orr    r0, r0, #0x00001000    //orr:逻辑或,开icache
#endif
    mcr    p15, 0, r0, c1, c0, 0

    // 设置栈,以便调用c函数
    ldr    sp, =0xD0037D80        //原因:IROM里的固定代码设置的sp就等于0xD003_7D80,这是
                            //遵从三星的旨意,也可以设置不覆盖我代码内存也行

    // 调用c函数,LED闪烁
    bl    led_blink        

halt:
    b halt

led.c中:

#define     GPJ2CON     (*(volatile unsigned long *) 0xE0200280)
#define     GPJ2DAT        (*(volatile unsigned long *) 0xE0200284)

// 延时函数
void delay(unsigned long count)
{
    volatile unsigned long i = count;
    while (i--)
        ;
}

void led_blink()                //LED 闪烁
{
    GPJ2CON = 0x00001111;        // 配置引脚
    while(1)                    // 闪烁
    {
        GPJ2DAT = 0;            // LED on
        delay(0x1000000);
        GPJ2DAT = 0xf;            // LED off
        delay(0x1000000);
    }
}


关键字:icache  调用C函数  S5PV210 引用地址:icache_设置栈调用C函数_S5PV210

上一篇:arm裸机驱动错误总结
下一篇:S5PV210裸机驱动开发之led关开门狗(加汇编注示)

推荐阅读最新更新时间:2026-02-09 19:04

ARM芯片开发学习(S5PV210)——icache、dcache介绍和如何开关icache
什么是icache、dcache cache是高速缓冲存储器,icache(instructions cache)是指令高速缓冲存储器,dcache(data cache)是数据高速缓冲存储器。存储介质的基本规律是读写速度越快单位存储容量的价格就越高,为了平衡存储速度和价格,计算机的采用分级的存储系统,按照读写速度由快到慢:CPU- 寄存器- cache- 内存- 外存。其中寄存器是在集成到Soc内部的,直接和CPU交互数据,数量有限;在性能高一些的计算机中,cache是可以采用多级的;内存一般是RAM,外存可以是磁盘、flash等。其中icache和dcache就是属于cache,icache用于缓存指令,dcache用于缓存数
[单片机]
arm汇编语言调用C函数之参数传递
对于ARM体系来说,不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard),ATPCS主要是定义了函数呼叫时参数的传递规则以及如何从函数返回,关于ATPCS的详细内容可以查看ADS1.2 Online Books Developer Guide的2.1节。这篇文档要讲的是 汇编代码中对C函数调用时如何进行参数的传递以及如何从C函数正确返回。 不同于x86的参数传递规则,ATPCS建议函数的形参不超过4个,如果形参个数少于或等于4,则形参由R0,R1,R2,R3四个寄存器进行传递;若形参个数大于4,大于4的部分必须通过堆栈进行传递。 我们
[单片机]
ARM开发环境KEIL和IAR设置的占用空间大小
大家在ARM开发过程中都会遇到堆栈不够或者堆栈设置太大的情况,下面我就通过IAR和KEIL两个开发环境,来介绍如何修改堆栈的大小 工具/原料 IAR KEIL 一、IAR 打开工程文件,在左上角工具栏选择 Project- Options... 在Category栏选中Linker 在右侧内容栏选中Config 勾选Override defaut选项 点击Edit按钮,在弹出的对话框中选中Stack/Heap Sizes,这样就可以修改CSTACK和HEAP的大小了 END 二、KEIL 打开ARM芯片的启动文件,比如startup_stm32f10x_md_vl.s文件 在文件的
[单片机]
ARM开发环境KEIL和IAR<font color='red'>设置</font>堆<font color='red'>栈</font>的占用空间大小
C语言及ARM中堆指针SP设置的理解与总结
什么是栈: 百度这么说:栈是一种特殊的线性表,是一种只允许在表的一端进行插入或删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶。表的另一端称为栈底。栈顶的当前位置是动态的,对栈顶当前位置的标记称为栈顶指针。当栈中没有数据元素时,称之为空栈。栈的插入操作通常称为进栈或入栈,栈的删除操作通常称为退栈或出栈。 简易理解: 客栈,即临时寄存的地方,计算机中的堆栈主要用来保存临时数据,局部变量和中断/调用子程序程序的返回地址。程序中栈主要是用来存储函数中的局部变量以及保存寄存器参数的,如果你用了操作系统,栈中还可能存储当前进线程的上下文。设置栈大小的一个原则是,保证栈不会下溢出到数据空间或程序空间。CPU在运行程序时,
[单片机]
深入分析MCU堆的作用,以及该如何设置大小
前段时间分享文章《STM32的启动流程到底是怎样的?》之后,很多朋友问了关于堆栈的问题。今天就写点相关内容,让大家进一步了解堆栈的知识。 1写在前面 我们都知道堆栈位于RAM中,现在MCU的RAM相对较大(几十上百K),所以分配的堆栈也是足够大,很多人都不怎么关注这个堆栈的大小。 但是,以前MCU的RAM比较小,甚至1K都不到,所以,以前的工程师就比较关心堆栈的大小。 对于小项目而言,可能我们不用关心堆栈大小。 但是,如果项目大了,你就要注意了,你堆栈大小设置不合理,很有可能导致Fault。 想要知道堆栈有多大才合适,你就需要明白堆栈的作用,下面让大家进一步了解堆栈。 2关于堆栈的基础知识 我们先看一下
[单片机]
STM32堆空间大小设置
1. 设置堆栈空间大小 在使用STM32编程时,一般情况下我们不会关注堆栈空间的大小,因为在STM32的启动文件中,已经帮我们预先设置好了堆栈空间的大小。如下图所示的启动代码中,Stack栈的大小为:0x400(1024Byte),Heap堆的大小为:0x200(512Byte)。 这也是为什么一个基础的工程编译后,RAM的空间也占用了1.6K左右的原因,因为堆栈的空间均分配在RAM中,可在编译的map文件中查看RAM资源占用的情况。 若工程中使用的局部变量较多,定义的数据长度较大时,若不调整栈的空间大小,则会导致程序出现栈溢出,程序运行结果与预期的不符或程序跑飞。这时我们就需要手动的调整栈的大小。 当工程中使用了
[单片机]
STM32堆<font color='red'>栈</font>空间大小<font color='red'>设置</font>
关于由CubeMx 生成stm32f4+freertos,不正常分析之堆大小设置
freertos官方手册上有说,移植中出现的问题大多数是由堆栈设置不合理造成的,今天结合自身遇到问题分析一下 1.任务堆栈设置过小,很容易造成硬件溢出,跳转到void HardFault_Handler(void); 调试方法,可以通过调用函数,UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );来跟踪剩余堆栈, 不过在CubeMx中的Configuration- FreeRtos- Include parameters中使能uxTaskGetStackHighWaterMark函数; 2.整体设置过小,TOTAL_HEAP_SIZE(Conf
[单片机]
STM32堆设置
1.堆和栈大小 定义大小在startup_stm32f2xx.s Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp ; h Heap Configuration ; o Heap Size (in Bytes) 0x0-0xFFFFFFFF:8 ; /h Heap_Size EQU 0x00000200 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base
[单片机]
STM32堆<font color='red'>栈</font><font color='red'>设置</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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