Samsung_tiny4412(驱动笔记02)----ASM with C,MMU,Exception,GIC

发布者:JoyfulMelody最新更新时间:2025-01-15 来源: cnblogs关键字:Samsung  tiny4412  ASM  with  MMU  GIC 手机看文章 扫描二维码
随时随地手机看文章

/****************************************************************************

 *

 *                        ASM with C,MMU,Exception,GIC

 *

 *  声明:

 *      1. 本系列文档是在vim下编辑,请尽量是用vim来阅读,在其它编辑器下可能会

 *         不对齐,从而影响阅读.

 *      2. 以下所有的shell命令都是在root权限下运行的;

 *      3. 文中在需要往文件中写入内容的时候使用了如下2方式:

 *          1.如果文件不存在,创建文件;如果存在,以覆盖的方式往文件中添加内容:

 *              cat > 文件名 << EOF (结束符)

 *              ...

 *              文件内容...

 *              ...

 *              EOF (输入遇到EOF,cat指令结束,内容将保存在前面指定的文件中)

 *          2.如果文件不存在,创建文件;如果存在,将内容追加到文件尾:

 *              cat >> 文件名 << EOF (结束符)

 *              ...

 *              文件内容...

 *              ...

 *              EOF 

 *

 ****************************************************************************/


                    \\\\\\\--*目录*--//////////////

                    |  一. 预热文章;                      

                    |  二. C语言中插入ARM汇编;            

                    |  三. U-Boot下汇编裸板开发基本流程;  

                    |  四. U-Boot下C语言裸板开发基本流程; 

                    |  五. MMU 配置流程;                  

                    |  六. Exception 配置及处理;          

                    |  七. 主程序对异常的处理;            

                    \\\\\\\\\\///////////////////


一. 预热文章:

    1. Make 命令教程

        url: http://www.ruanyifeng.com/blog/2015/02/make.html

    2. ATPCS和内嵌汇编: arm处理器上函数调用寄存器的使用规则

        url: http://bog.csdn.net/yypony/article/details/17633323


二. C语言中插入ARM汇编:

    1. cat > test.c << EOF

         #include

         int main(void)

         {

             volatile  unsigned int a ;

             int b ;

             __asm__  __volatile__ (

             'mov r0, #11  n'      // 如果立即数小于256直接附值

             'mov %0, r0   n'

             'mov %1, #125 n'

             :'=r'(a),'=r'(b)       // 输出

             :                      // 输入

             :'r0'                  // 已经使用过的寄存器

             );

             printf('a:%d b:%d n' , a , b);

             return 0 ;

         }

         EOF

     2. arm-linux-gcc test.c -o test

     3. minicom(U-Boot)中运行编译好的test程序: ./test


三. U-Boot下汇编裸板开发基本流程:

    1. 编译好U-Boot后,在其根目标录下会生成一个System.map文件,这是U-Boot中提供的

        函数及其地址(符号表),我们可以把U-Boot当作一个函数库来使用.

    2. cat > test.S << EOF

         .global _start

         _start:

             stmfd sp! , {r0-r12 , lr} @寄存器入栈


             @ 0x43e11434是U-Boot中printf地址,这个地址不是固定,这是我编译的U-Boot中

             @ printf的地址, 因为如果修改了U-Boot的源码,printf地址会变,U-Boot其他

             @ 函数地址也会变,所以大家以各自编译U-Boot后产生的System.map文件中的

             @ 地址为准.

             ldr r1 , =0x43e11434 

             ldr r0 , =str

             mov lr , pc

             mov pc , r1

         

             ldmfd sp! , {r0-r12 , pc} @寄存器出栈

         str:

             .string    'hello worldn'

             .align     5

         EOF

    3. cat > Makefile << EOF 

         all:

             arm-linux-gcc -c test.S -o test.o

             arm-linux-ld -Ttext=0x40008000 test.o -o test # 0x40008000是加载代码的起始地址

             arm-linux-objcopy -O binary test test.bin     # 获取二进制可运行文件

         

         clean:

             rm -rf  test.o  test test.bin

         EOF

    4. make 

    5. 将test.bin烧入开发板,运行程序,得到结果.

    6. 如果不使用默认的连接文件,采用自己编写的连接文件,操作如下:

        1. 获取链接脚本模板: arm-linux-ld --verbose > test.lds ,修改模板文件为如下文件内容:

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

            /* Script for -z combreloc: combine and sort reloc sections */

            OUTPUT_FORMAT('elf32-littlearm', 'elf32-bigarm',

                      'elf32-littlearm')

            OUTPUT_ARCH(arm)

            ENTRY(_start)

            SEARCH_DIR('=/usr/local/lib'); SEARCH_DIR('=/lib'); SEARCH_DIR('=/usr/lib');

            SECTIONS

            {

                . = 0x40008000 ; /* 运行代码的起始地址 */

                .text :

                {

                    test.o(.text) ;  /* _start标号在这个文件里 */

                    *(.text) ;

                }

                align = 4 ; 

            }

        2. 修改Makefile如下: cat > Makefile << EOF 

            all:

                arm-linux-gcc -c test.S -o test.o 

                arm-linux-ld -T test.lds *.o -o test

                arm-linux-objcopy -O binary test  test.bin

            clean:

                rm -rf test.o test test.bin 

            EOF


四. U-Boot下C语言裸板开发基本流程:

    1. 编译好U-Boot后,在其根目标录下会生成一个System.map文件,这是U-Boot中提供的

        函数及其地址(符号表),我们可以把U-Boot当作一个函数库来使用.

    2. cat > test.c << EOF

        int num = 1;

        int array[10] = {0}; 

        //0x43e11434是U-Boot中printf地址,这个地址不是固定,如果修改了源码,地址可能会变

        int (*printf)(const char *fmt , ...) = (void *)0x43e11434; 

        int _start(void) // 这里不能是main,因为裸板运行的其实函数是_start,和汇编一样

        {

            printf('num:%d n' , num);

            int i ; 

            for(i = 0 ; i < 10; i++)

            {

                printf('array[%d]: %d n' , i , array[i]);   

            }

        

            return 0 ; 

        }

        EOF

    3. cat > Makefile << EOF 

        all:

            arm-linux-gcc -c  test.c  -o  test.o -fno-builtin

            arm-linux-ld  -T test.lds  *.o  -o  test #采用第三部分的lds文件

            arm-linux-objcopy -O binary test  test.bin

        clean:

            rm -rf test  test.bin   *.o 

        EOF

    4. make

    5. 将test.bin烧入开发板,运行程序,得到结果.


五. MMU 配置流程:

    void memset(int *ttb , char ch , int size )

    {

[1] [2] [3]
关键字:Samsung  tiny4412  ASM  with  MMU  GIC 引用地址:Samsung_tiny4412(驱动笔记02)----ASM with C,MMU,Exception,GIC

上一篇:ARM_Instruction_Set_Encoding_hacking(ARM指令集编码格式解读)
下一篇:tiny4412 UART for C printf Demo

推荐阅读最新更新时间:2026-03-25 11:30

Tiny4412中断控制器(GIC)之WDT中断
#include regs.h void enable_mmu(unsigned long ttb); void init_ttb(unsigned long *ttb_base); void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa); void memset(char *buf, char ch, int size); void memcpy(char *dst, char *src, int size); void do_irq(unsigned long regs ); void (*printf)(char *, ...) = 0x
[单片机]
Tiny4412中断控制器(GIC)之PWM
#include regs.h void enable_mmu(unsigned long ttb); void init_ttb(unsigned long *ttb_base); void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa); void memset(char *buf, char ch, int size); void memcpy(char *dst, char *src, int size); void do_irq(unsigned long regs ); void (*printf)(char *, ...) = 0x
[单片机]
Tiny4412MMU映射代码示例
1、关于页表:ARMv6的MMU进行地址映射时涉及到两种页表, 一级页表(first level page table)和二级页表(coarse page table)。 2、关于映射方式:映射方式有两种,段映射和页映射。 段映射只用到一级页表,页映射用到一级页表和二级页表。 3、关于映射粒度:段映射的映射粒度有两种,1M section和16M supersection; 页映射的映射粒度也有两种,4K small page和64K large page。 ============================================
[单片机]
Tiny4412C语言实现流水灯,Tiny4412裸机程序[3]
在前边我们使用汇编完成了一个流水灯实验: Tiny4412汇编流水灯代码,Tiny4412裸机LED操作 ---- - -- -- -- - -- -- 修改: # ${MKBL2} ${SOURCE_FILE} bl2.bin 14336 ./${MKBL2} ${SOURCE_FILE} bl2.bin 14336 或者: MKBL2=my_mkbl2改成MKBL2=./my_mkbl2 必须有:chmod +x my_mkbl2 chmod 777 my_mkbl2 然后 查看下权限 ls -l my_mkbl2 变黄即可 后编译成功 r
[单片机]
<font color='red'>Tiny4412</font>之<font color='red'>C</font>语言实现流水灯,<font color='red'>Tiny4412</font>裸机程序[3]
s3c2410 MMU
MMU,全称Memory Manage Unit, 中文名——存储器管理单元。 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。覆盖块0首先运行,结束时他将调用另一个覆盖块。虽然覆盖块的交换是由OS完成的,但是必须先由程序员把程序先进行分割,这是一个费时费力的工作,而且相当枯燥。人
[单片机]
s3<font color='red'>c</font>2410 <font color='red'>MMU</font>
s3c2440 内存管理单元MMU学习笔记
学习了S3C2440内存管理单元MMU,主要参考了《嵌入式Linux应用开发完全手册》 (下载见 http://www.linuxidc.com/Linux/2011-01/31114.htm )。有两篇文章也说得很详细,分别是 http://www.linuxidc.com/Linux/2011-09/43526.htm 与 http://www.linuxidc.com/Linux/2011-09/43525.htm 感兴趣的可以参考一下,我就不重复内容了。但是它们在MMU地址变换过程这一块说得不太好理解。在此,我就按照我的理解将《嵌入式Linux应用开发完全手册》的相关内容解释一下,图片加点注释。如有错误,请大家不吝赐教,我
[单片机]
s3<font color='red'>c</font>2440 内存管理单元<font color='red'>MMU</font>学习笔记
基于S3C6410的ARM11学习(十五) MMU来了
如今,已经是到了main的世界了。下面就要来体验ARM11的MMU,这个东西在STM32中是没有的。之前在核心初始化过程中,是将MMU功能给关闭的。那是因为那个时候,操作的都是物理地址,所以需要将MMU关闭。 MMU,内存管理单元。主要是有两个作用: 1、 将虚拟地址转化为物理地址 2、 内存的访问权限管理 上面这个图就说明了MMU的作用。 有三个任务在运行,运行的地址都是0x400000,如果不进行处理,这肯定是不行的。所以加入了MMU,MMU其实就是一个页表。将虚拟地址通过查表的方式,对应到物理地址去。虽然三个任务的运行地址都是0x400000,但是这个地址是虚拟地址,在页表中,将每个任务的虚拟地址对
[单片机]
基于S3<font color='red'>C</font>6410的ARM11学习(十五) <font color='red'>MMU</font>来了
基于S3C6410的ARM11学习(七) 核心初始化之关闭MMU和CACHE
在关闭了所有中断后,就要关闭MMU和CACHE了。因为这个时候,还在初始化环境,这两个东西是用不到的。所以就需要把他们都关闭,免得影响我们的初始化。 MMU是Memory Management Unit的缩写,中文名是 存储器 管理单元。主要是两个功能: 1、虚拟地址转换为物理地址 2、实现内存的保护 至于具体的MMU的一些知识,等后面用到了在说明了。目前,只需要将MMU给关掉即可。 这个时候,我们需要查看S3C6410的核ARM1176JZFS手册。在这里,我们要接触到一个系统控制处理器,CP15。也叫做协处理器。 手册中说明了,CP15系统控制处理器的作用,主要是6个: 1、整个系统的控制
[单片机]
基于S3<font color='red'>C</font>6410的ARM11学习(七) 核心初始化之关闭<font color='red'>MMU</font>和CACHE
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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