摘要:
以下裸机程序基于GT2440,编译器为arm-linux-gcc-4.4.3。 程序结构:本程序只有一个spi.S文件。 程序流程:首先上电复位进入复位异常,在复位异常里依次调用子程序关闭看门狗、初始化系统时钟、初始化串口,最后调用spi发送数据,spi发送的数据在程序里指定,对于本程序发送数据为一个字节的字符‘A’,最后spi将接收到的数据发送到串口,在终端上显示出来。spi.S: 1 //寄存器物理地址宏定义 2 #define WTCON 0x53000000 3 4 #define LOCKTIME 0x4C000000 5 #define MPLLCO... 阅读全文
摘要:
以下裸机程序基于GT2440,编译器为arm-linux-gcc-4.4.3。 程序结构:程序只有一个uart.S文件。 程序流程:首先上电复位,进入复位异常处理,关闭看门狗,初始化系统时钟(FCLK=400MHZ,HCLK=100MHZ,PCLK=50MHZ),初始化串口(无检验位,1位停止位,8位数据位,115200bps),最后跳到test_uart子程序,在该程序里不断等待用户输入数据(一个字节),如果用户输入了数据就跳到发送数据子程序,在子程序里将用户输入的数据+1后再发送给用户,此时用户可以在终端看到被+1了的数据。uart.S: 1 //寄存器物理地址宏定义 2... 阅读全文
摘要:
以下裸机程序基于GT2440,编译器为arm-linux-gcc-4.4.3。 程序结构:程序由sdram.S和main.c两个文件组成,sdram.S文件完成一些初始化工作,如时钟初始化,内存控制器初始化,拷贝第二阶段代码到sdram等;main.c负责循环点亮、熄灭四个LED。 程序流程:上电时,cpu自动跳到复位异常向量入口,在复位异常处理里首先关闭看门狗,接着初始化系统时钟,初始化内存控制器,拷贝第二阶段代码到sdram,最后跳转到sdram里执行main()函数。sdram.S: 1 #define MEM_REG_START 0x48000000 2 #defi... 阅读全文
摘要:
以下裸机程序基于GT2440,编译器为arm-linux-gcc-4.4.3。 程序布局:源代码由interrupt.S和led.c两个文件组成,interrupt负责初始化工作,led.c里定义了中断处理程序。 程序流程:首先安装异常向量表,在复位异常里关闭看门狗,然后进入普通中断模式,设置普通中断的栈指针(为C语言写的中断处理程序做准备),接着设为特权模式,初始化中断(设置IO管脚,开启中断),最后CPU一直死循环等待外部中断触发。当外部中断到来时,先保护现场,跳到led.c里的handle_irp()函数,在该函数里将四个LED点亮,接着返回,最后恢复现场,返回到死循环。int... 阅读全文
摘要:
以下裸机程序基于GT2440,编译器为arm-linux-gcc-4.4.3。 程序的功能为:开机上电首先跳转到复位异常处理,在复位异常处理里关闭看门狗,然后执行LED控制程序,程序运行结果为板上4个LED全亮。led.S文件: 1 @寄存器物理地址宏定义 2 #define WTCON 0x53000000 3 #define GPBCON 0x56000010 4 #define GPBDAT 0x56000014 5 #define GPBUP 0x56000018 6 #define nGPB_OUTPUT ((1<<10)|(1<<12)|(1<< 阅读全文
摘要:
上半个月在学习bootloader,突然找到了一个非常好的vboot,vboot只有最基本的内核引导功能(基于s3c2440,从nand flash启动),对其深入研究后,发现对bootloader有了比较全面的理解,虽然没有像uboot那么多功能,但vboot已经实现了bootloader最核心的功能,其他像什么网络功能、烧写功能等等也只是一些裸机驱动而已。学习bootloader需要有汇编的基础,如果有单片机编程经验的话那更是“如鱼得水”了。 先看vboot的整体架构,下面是vboot包含的所有文件:很简单是吧,其中核心的文件是head.S、main.c和nand.c,vboo... 阅读全文
摘要:
最近重装了电脑,一开始时装了个最新版的Ubuntu12.04,发现unity界面真心不好用(不习惯),转回gnome界面又实在太丑了,于是想到了Linux Mint这个发行版本,装了最新版的Mint13,用了一会,感觉不错,给人一阵清新的感觉,桌面与windows比较类似,更重要的是Linux Mint是基于Ubuntu的。由于之前一直习惯用root登录,网上搜了一遍竟然没找到怎么用root登录的方法,于是经过一番研究,终于找到了方法,很简单,分享如下:在Menu--->控制中心,如下图:点击“登录窗口”图标,再点击“安全”项出现下图:勾选“允许本地系统管理员登录”即可。 阅读全文
摘要:
一. 概述 汇编通过call指令调用C函数,call指令主要有两个功能:1.将下一条指令的地址保存在栈顶;2.设置eip指向被调用程序代码的开始处。汇编使用ret指令返回,ret的功能是把返回地址从桟里弹出,并转到该地址去执行。 汇编程序调用C函数时,函数的入口参数使用堆栈来传送。 C函数调用时,输入参数采用堆栈方式传递,参数的传递顺序是从右到左,调用者负责清除参数占用的堆栈空间。 C函数的返回值如果是32位整数则存在eax寄存器,如果是64位整数,则存在edx:eax寄存器。二. 实现 下面的程序由2个文件组成,一个是assembly.s,另外一个是gnuc.c。程序的功能是:在gnuc.. 阅读全文
摘要:
一. 概述 系统调用是应用程序与内核交互的一种方式。系统调用作为一种接口,通过系统调用,应用程序能够进入操作系统内核,从而使用内核提供的各种资源,比如操作硬件,开关中断,改变特权模式等等。首先,系统调用是一个软中断,既然是中断那么一般就具有中断号和中断处理程序两个属性,Linux使用0x80号中断作为系统调用的入口,而中断处理程序的地址放在中断向量表里。二. 过程 基于linux-2.6.38,以read()系统调用函数为例进行说明。 在用户空间,read()函数的声明位于#include<unistd.h>,原型为:ssize_t read(int fd, void *b... 阅读全文
摘要:
写在前面:很久没写博客了,因为上一个月要期末考试,所以也就没什么时间去学习其他东西了。现在好了,暑假可以静下心来留在实验室好好搞技术。下面的内容是之前学习过的,现在把它整理出来,就当作是一个总结吧。一、概述 Linux内核中大量使用了链表这个基本数据结构,因此有必要去窥探一下其“葫芦里卖的是什么药”。先来些基本知识点吧:1.数据元素间是一对一关系;2.链表中的元素个数是有限的;3.同一表中各数据元素的类型和长度相同。二、实现 先上代码,有个感性的认识,后面再解释。 1 #include<stdio.h> 2 #include<malloc.h> 3 4 //链表头结构 阅读全文