armos
文章平均质量分 95
poclist
软件开发工程师。
展开
-
自己动手写最简单的bootloader
首先我们必须要知道,一开始我们的开发板上电的时候,如果我们的板子是从norflash启动的,那么硬件会从nandflash拷贝其前4k的代码到内部RAM中, (这也是为什么我们的bootloader第一阶段需要在4k内),如果是norflash启动,那也是从norflash把前4k代码复制到内部RAM中我们知道mini2440有个看门狗,如果说我们不能够定时去喂狗,那么它会在超时的转载 2016-09-04 16:10:37 · 3421 阅读 · 0 评论 -
自己写bootloader笔记6---boot.c分析(u-boot向内核传递参数及跳转到内核)
#include "setup.h"extern void uart0_init(void);extern void nand_read(unsigned int addr, unsigned char *buf, unsigned int len);extern void puts(char *str);extern void puthex(unsigned int va转载 2016-09-04 17:07:39 · 355 阅读 · 0 评论 -
自己写一个最简单的bootloader_jz2440
boot是为了启动内核,本质上也就是一个裸板程序,就是为了引导内核的启动。所以打算自己写一个boot,功能只有引导内核启动。首先是汇编的代码段,是为了关闭看门狗,设置时钟以及代码的重定位,这些都是在main函数之前执行的。之前学习单片机的时候,我们只看到main函数,实际上是main之前的执行步骤都被包起来了。整个汇编文件的开头要写上.text @这是为了表转载 2016-09-04 17:13:11 · 401 阅读 · 0 评论 -
Linux链接脚本学习--lds
一、概论ld:GNU的链接器.用来把一定量的目标文件跟档案文件链接在一起,并重新定位它们的数据,链接符号引用.一般编译一个程序时,最后一步就是运行ld进行链接每一个链接都被一个链接脚本所控制,这个脚本是用链接命令语言书写的.二、链接脚本链接脚本的一个主要目的是描述输入文件中的各个段(数据段,代码段,堆,栈,bss)如何被映射到输出文件中,并控制输出文件的内存转载 2016-09-04 17:34:57 · 284 阅读 · 0 评论 -
Linux下的lds链接脚本详解
一、 概论每一个链接过程都由链接脚本(linker script, 一般以lds作为文件的后缀名)控制. 链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局. 但你也可以用连接命令做一些其他事情.连接器有个默认的内置连接脚本, 可用ld –verbose查看. 连接选项-r和-N可以影响默认的连接脚本(如何影响?).-转载 2016-09-04 17:37:55 · 402 阅读 · 0 评论 -
Linux下C的编译和链接
1.源程序的编译/* main.c */#include "mytool1.h"#include "mytool2.h"int main(int argc,char **argv){mytool1_print("hello");mytool2_print("hello");}/* mytool1.h */#ifndef _MYTOOL_1_H#define _MYTOOL_转载 2016-09-04 18:02:51 · 368 阅读 · 0 评论 -
Linux下编译、链接和装载
编译过程在Linux下使用GCC将源码编译成可执行文件的过程可以分解为4个步骤,分别是预处理(Prepressing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。一个简单的hello word程序编译过程如下:1. 预处理首先源代码文件(.c/.cpp)和相关头文件(.h/.hpp)被预处理器cpp预编译成.i文件(C++为.ii)。预处理命转载 2016-09-04 18:10:17 · 288 阅读 · 0 评论 -
ARM工作模式与寻址方式
1. 工作状态从编程的角度看,ARM微处理器的工作状态一般有两种,并可在两种状态之间切换:1)第一种为ARM状态,此时处理器执行32的字对齐ARM指令,绝大部分工作在此状态;2)第二种为Thumb状态,此时处理器执行16位的、半字对齐的Thumb指令。ARM微处理器有32位的ARM指令集和16位的Thumb指令集,微处理器可以随时在两种工作状态之间切换,并且,处理器工作状态的转变并转载 2016-09-04 19:00:51 · 640 阅读 · 0 评论 -
ARM寄存器介绍
ARM处理器模式用户模式(User):ARM处理器正常的程序执行状态快速中断模式(FIQ):用于高速数据传输或通道处理外部中断模式(IRQ):用于通用的中断处理管理模式(Supervisor):操作系统使用的保护模式数据访问终止模式(Abort):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护系统模式(System):运行具有特权的操作系统任务未定义指令中止转载 2016-09-04 19:04:03 · 347 阅读 · 0 评论 -
汇编语言---GCC内联汇编
GCC支持在C/C++代码中嵌入汇编代码,这些代码被称作是"GCC Inline ASM"(GCC内联汇编);一、基本内联汇编GCC中基本的内联汇编非常易懂,格式如下:__asm__ [__volatile__] ("instruction list");其中,1.__asm__:它是GCC定义的关键字asm的宏定义(#define __asm__ asm),它用来声明一个转载 2016-09-04 19:06:41 · 345 阅读 · 0 评论 -
FreeRTOS高级篇4---FreeRTOS任务切换分析
FreeRTOS任务相关的代码大约占总代码的一半左右,这些代码都在为一件事情而努力,即找到优先级最高的就绪任务,并使之获得CPU运行权。任务切换是这一过程的直接实施者,为了更快的找到优先级最高的就绪任务,任务切换的代码通常都是精心设计的,甚至会用到汇编指令或者与硬件相关的特性,比如Cortex-M3的CLZ指令。因此任务切换的大部分代码是由硬件移植层提供的,不同的平台,实现发方法也可能不同,这篇文...转载 2019-07-11 19:23:48 · 413 阅读 · 0 评论 -
一步步写STM32 OS【三】PendSV与堆栈操作
一、什么是PendSVPendSV是可悬起异常,如果我们把它配置最低优先级,那么如果同时有多个异常被触发,它会在其他异常执行完毕后再执行,而且任何异常都可以中断它。更详细的内容在《Cortex-M3 权威指南》里有介绍,下面我摘抄了一段。OS 可以利用它“缓期执行”一个异常——直到其它重要的任务完成后才执行动 作。悬起 PendSV 的方法是:手工往 NVIC的 PendSV悬起寄存器中写...转载 2019-07-11 19:24:52 · 633 阅读 · 0 评论 -
手写RTOS-PendSV中断
今天这一篇,我们说一下操作系统都要用到的PendSV中断,整个操作系统中,要自己写的的汇编代码不超过20行,全部都在PendSV中断里。以下是《Cotex-M3权威指南》里对PendSV的描述: 它是可以像普通的中断一样被悬起的。 OS 可以利用它“缓期执行” 一个异常——直到其它重要的任务完成后才执行动作。 悬起 PendSV 的方法是: 手工往 NVIC 的 PendSV 悬起寄...转载 2019-07-11 19:26:08 · 724 阅读 · 0 评论 -
自己写bootloader笔记7---Makefile分析
arm-linux-gcc是交叉编译工具链,用于 编译出能在ARM平台上运行的程序,而gcc编译出来的程序在x86平台上运行 CC = arm-linux-gcc用于将多个目标文件、库文件链接成可执行文件LD = arm-linux-ldAR = arm-linux-ar复制一个目标文件的内容到另一个文件OBJCOPY = arm-linux-转载 2016-09-04 17:06:59 · 301 阅读 · 0 评论 -
自己写bootloader笔记5---设置u-boot传给内核的参数分析
1、分析(1)u-boot要启动内核,把内核从flash读到SDRAM ,要调到SDRAM执行,u-boot执行时内核还没执行,内核执行时,u-boot已完结。u-boot传参数给内核(双方约定一个位置),u-boot在那位置存数据,数据格式也要 双方约定好(2)0x30000000是内存的起始地址,0x30008000地址开始用于存放内核,参数存储双方约定的地址是0x30000100,转载 2016-09-04 17:05:38 · 361 阅读 · 0 评论 -
自己写bootloader笔记3---init.c分析
/* NAND FLASH控制器 */#define NFCONF (*((volatile unsigned long *)0x4E000000))#define NFCONT (*((volatile unsigned long *)0x4E000004))#define NFCMMD (*((volatile unsigned char *)0x4E000008))#defi转载 2016-09-04 17:04:47 · 253 阅读 · 0 评论 -
自己写bootloader
按照前面分析的u-boot的启动流程,自己写一个简单的Bootloader。这是参考韦东山老师的视频写的。1、初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND Flash2、如果Bootloader比较大,要重定位到SDRAM3、把内核从NAND FLASH读入SDRAM4、设置“要传给内核的参数”5、跳转执行内核start.S代码如下:[cpp]原创 2016-09-04 16:14:14 · 1109 阅读 · 0 评论 -
u-boot源码分析
看到不错的文章,不要添加收藏夹,想着以后有时间再看,因为很有可能你以后再也不会看它们了。想写总结的文章,不要想着等到以后有时间了再总结,因为很有可能你以后更没有时间总结它们了。——送给自己+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++前面两节已经知道,转载 2016-09-04 16:19:17 · 453 阅读 · 0 评论 -
bootloader-我是bootloader设计师
一、bootloader设计蓝图1、什么是bootloader如果说系统内核是航天飞机的话,那么bootloader就是助推器,它带动了内核。在内核启动之前它要做许多硬件的初始化操作,来适合系统的安全启动。2、bootloader设计方法-模仿90%的设计从模仿开始,模仿加入自己的想法就是设计。bootloader的模仿我们一般会参照行业老大uboot。3、uboot简介u转载 2016-09-04 16:21:02 · 482 阅读 · 0 评论 -
ARM裸机开发-bootloader-内部看ARM
一、嵌入式大汇总1、芯片:s3c2440、s3c6410、s5pv2102、ARM核:A8、ARM9、ARM113、指令架构:armv7、armv62440使用的是arm9的核,内核使用的是armv4的指令架构;6410使用的是arm11的核,内核使用的是armv6的指令架构;210使用的是A8的核,内核使用的是armv7的指令架构。arm11 cortexA5 A8转载 2016-09-04 16:23:31 · 780 阅读 · 0 评论 -
自己写bootloader1 - start.S,基于s3c2440
bootloader的目的是启动内核。主要做两方面的工作:把内核从nand读入sdram,跳转执行。bootloader分成两步走:第一是硬件相关的初始化,然后跳转到main中执行。首先是硬件相关初始化:关看门狗,设置时钟,初始化SDRAM,代码重定位,跳转到main中执行。start.S里面的代码(start.S不能是start.s) #define S3C2440_MPLL_20转载 2016-09-04 16:47:08 · 638 阅读 · 0 评论 -
自己写bootloader2 -跳转执行,基于s3c2440
main函数中主要做三件事:从nandflsah中把内核独到内存,设置参数,跳转执行。代码为:#include "setup.h"extern void uart0_init(void);extern void nand_read(unsigned int addr, unsigned char *buf, unsigned int len);extern void puts(cha转载 2016-09-04 16:47:54 · 319 阅读 · 0 评论 -
自己写bootloader2 -init.c,基于s3c2440
这里面主要是从拷贝代码到内存,清除BSS,还有nand的读函数。#define NFCONF (*((volatile unsigned long *)0x4E000000))#define NFCONT (*((volatile unsigned long *)0x4E000004)) #define NFCMMD (*((volatile unsigned char *)0x4E0转载 2016-09-04 16:48:33 · 265 阅读 · 0 评论 -
从零写bootloader--第一阶段启动的实现
韦东山视频学习笔记。平台JZ2440。CPU为S3C2440A,NandFlash型号为K9F2G08U0M。本文如果有什么错误的地方,欢迎各位批评指正,不甚感激。注:第一阶段部分函数未完成,还不能启动内核一、剖析实现从零写bootloader我们所要做的工作: 要想从零写出自己的bootloader,我们得先知道bootloader的目的是干嘛。就好像我们做事,得先明确转载 2016-09-04 16:51:39 · 743 阅读 · 0 评论 -
从零写bootloader--第二阶段启动的实现
说明:第一阶段和第二阶段具体细节未做说明,旨在整个启动流程,即如何自己实现bootloader的整体思维。代码附带贴出,可以参考。在第一阶段start.s中未完成的工作只剩下main函数。main函数的工作如下:1、从NandFlash中把内核读入内存2、设置需要传递的参数3、跳转执行第一阶段代码与下面代码一起便可启动内核,具体不在此分析,如不理解,可以参看uboot源码b转载 2016-09-04 16:52:24 · 622 阅读 · 0 评论 -
自己写bootloader笔记1---流程分析
1、从bootloader作用看写bootloader需要的内容(1)目的:启动内核(2)过程 (2.1)从flash上把内核读入内存 能读flash 初始化内存 初始化时钟(2440一上电时运行频率是12M,所以要让它能运行更快点) 其他 (2.2)启动转载 2016-09-04 16:59:19 · 318 阅读 · 0 评论 -
自己写bootloader笔记2---start.S分析
1、框架(1)关看门狗//对2440来说,看门狗一上电是打开的,不关掉过3秒会复位整个开发板(2)设置时钟//2440一上电时运行频率是12M,所以要让它能运行更快点(3)初始化SDRAM (重定位时用到)(4)重定位(bootloader比较小时,在nor flash上运行就可以了。如果bootloader比较大,要把它重定位到SDRAM)执行main(其它复杂功能的代码用C转载 2016-09-04 17:01:24 · 399 阅读 · 0 评论 -
自己写bootloader笔记4---uboot.lds分析
1、链接脚本格式基本命令SECTIONS描述输出文件的映射图:->输出文件各段、各文件怎么放置一个SECTIONS命令内部包含一个或多个段,段是连接脚本的基本单元,它表示输入文件某部分怎么放置;格式:SECTIONS{ ...secname start ALIGN(align)(NOLOAD):AT(ldadr){contents}转载 2016-09-04 17:03:50 · 330 阅读 · 0 评论 -
cortex-M3 的SVC、PendSV异常,与操作系统(ucos实时系统)
SVC异常是?PendSV异常是?ucos 任务切换时机?ucos 如何满足实时性(实现)?ucos中,systick的优先级?SVC和PendSVSVC(系统服务调用,亦简称系统调用)和PendSV(可悬起系统调用),它们多用于在操作系统之上的软件开发中。SVC:SVC 用于产生系统函数的调用请求。例如,操作系统不让用户程序直接访问硬件,而是通过提供一些系统服务函数,用户程...转载 2019-07-11 19:30:21 · 763 阅读 · 0 评论