学习ARM开发(10)
2023-09-14 09:10:39 时间
学习ARM开发(10) /* 用循环调用所有初始化函数 */ for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { if ((*init_fnc_ptr)() != 0) { /* 当每个函数初始化失败时,就会挂机在这里。 */ hang(); } } 上次说到在函数指针数组里,不断地调用所有初始化函数进行初始化,下面就来仔细地分析一下,它们到底是做什么的,做什么样的初始化,怎么样为后面做好运行的准备工作。看到第一个初始化函数,就是CPU初始化(cpu_init),这个函数是在cpu/s3c44b0/cpu.c里,它的作用就是进行S3C44B0初始化工作。看到这个函数内容如下: /* CPU初始化。 蔡军生 2005/07/23 */ int cpu_init (void) { /* 清空缓冲区 */ icache_enable(); return 0; } 它在里面调用了函数icache_enable(),它就是用来初始化S3C44B0的缓冲区,并且启用CPU缓冲区。因为CPU在加电之后,它的初始化值是不启用内部的8K缓冲区的,必须由程序进行设置。接着看看那个调用的函数又是怎么样初始化内部缓存区的呢? /* CPU内存的缓冲初始化。 蔡军生 2005/07/23 */ void icache_enable (void) { ulong reg; /* 清空内存的缓冲区. */ s3c44b0_flush_cache(); /* 初始化缓冲区, 设置非缓冲区的起始地址和结束地址。 第一个寄存器指明下面的地址不要缓存,低16位是起始地址, 高16位是结束地址。并且空间大小都是以4K为界。 0x0000:0000 - 0x0C00:0000 */ NCACHBE0 = 0xC0000000; NCACHBE1 = 0x00000000; /* 设置SYSCFG寄存器启用8K缓冲区。 */ reg = SYSCFG; reg |= 0x00000006; /* 8kB */ SYSCFG = reg; } 在这个函数里,第一个先调用函数是进行缓冲区清0的工作,它有一些特别的地方,如下: /* CPU的内部缓冲初始化。 蔡军生 2005/07/23 */ static void s3c44b0_flush_cache(void) { volatile int i; /* 清空缓冲区,每次要按4个32位来读写,所以要加16. */ for( i = 0x10002000; i < 0x10004800; i += 16 ) { *((int *)i)=0x0; } } 它用一个for循环进行内部的缓冲区初始化,由于S3C44B0决定每次读写都是按16字节进行的。因此,这里的i就是不断地加16个字节。不过,这里为什么不清除0x10000000到0x10001fff区域呢?这个我也没有搞清楚,等我有空试试清除有没有问题! 到现在为止,缓冲区已经清空,就要设置那些内存区域是不要进行缓存的。因为不是所有内存都需要进行缓冲的,比如读取外面的IO,就不需要进行缓冲;读取FLASH也不需要。因此,设置第一个非缓冲区的起始地址为NCACHBE0 = 0xC0000000,这个值里的低16位是起始地址0x0000,它的32位地址就是从0x00000000开始。它的高16位是结束地址0Xc000,它的32位地址就是从0Xc0000000结束。最后就是通过设置SYSCFG寄存器的[2:1]位的值为11,就启用了8K内存数据和指令缓冲区。到这里为止,就已经设置好CPU的缓冲区初始化和启用。 |
让我们的产品超越日本产品! |
相关文章
- .net学习笔记11–数据验证控件–RangeValidator
- vr体验心得_在我们新的VR学习体验中逃脱女巫的小屋
- CQRS模式学习
- NeurIPS 2022 | 视觉长尾学习模型为何无法较好地落地?
- javaweb学习总结(三十四)——使用JDBC处理MySQL大数据详解编程语言
- python学习 正则表达式详解编程语言
- 程序Linux系统下运行ARM程序的实践(linux运行arm)
- Linux服务器:快速学习视频教程(linux服务器视频教程)
- 教程学习Linux编程:视频教程助力学习进步(linux编程视频)
- 机器学习的应用领域有哪些?
- 在ARM芯片上探索Linux之旅(arm上运行linux)
- 里学习Oracle存储过程实战:在此学习即刻提升技能(oracle存储过程在哪)
- 老男孩学习 Linux 实战视频(老男孩linux视频)
- Linux之美:学习与探索(linux好的书)
- Oracle时间计算:学习如何计算两个时间之间的差异(oracle两时间相减)
- 学习Linux命令,掌握技巧突破极限!(linux 命令 技巧)
- ARM板子上部署MySQL的步骤(arm板安装mysql)
- 从零开始,ARM环境下MySQL系统的初始化(arm初始化mysql)
- 借助ARM实现连接Oracle系统(arm 连接oracle)
- 用ARM下安装Oracle轻松又轻快(arm 安装oracle)
- Mysql数据库管理利器Xmind思维导图教你轻松学习(mysql xmind)
- 架构Redis在Arm架构上的完美适配(redis 适配arm)
- 芯片基于Redis为ARM芯片适配(redis 适配arm)
- Redis在ARM上的性能优势(redis 适配arm)
- Redis在ARM上的性能体验(redis 适配arm)
- 基于ARM架构的Redis部署优化实践(redis 适配arm)
- 开发Redis在ARM体系结构中的应用开发(redis 适配arm)
- 平台Redis在ARM平台上的部署实践(redis 适配arm)
- 处理器Redis在ARM处理器上的优化实践(redis 适配arm)
- Redis在ARM上的适配探索(redis 适配arm)
- Redis与ARM架构的完美适配(redis 适配arm)
- Redis在ARM上的稳定性适配实现(redis 适配arm)
- 简明Python基础学习教程