显示下一条  |  关闭

5deweb的博客

学习这件事,不是缺乏时间,而是缺乏努力!

 
 
 
 
 
 
 
 
 
 
下载音乐盒  曲目表歌词秀
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 我要留言
 
 
 
留言列表加载中...
 
 
 
 
 
 
 
 

FreeRTOS是如何工作的---从基本原理到实现

2011-4-27 14:11:06 阅读96 评论0 272011/04 Apr27

本文描述FreeRTOS是如何实现的。

如果你

1. 希望修改FreeRTOS源代码

2. 移植实时内核到另一个微控制器或者原型板(prototyping board)

3. 第一次接触FreeRTOS,希望得到关于它们在操作和实现上的更多信息

这些文档会有用。

本文档分为两个章节:

1. 基本原理和RTOS概念

包括多任务的背景信息和基本实时概念,这是为初学者准备的(is intended for beginners)

2. 从底向上(from the bottom up)解释实时内核源代码

FreeRTOS实时内核已经移植到许多不同的微控制器架构下。这份文档是以Atmel AVR为范例,因为:

1. AVR架构简单

2. 有免费可用的开发工具 WinAVR (GCC) development tools.

3. 非常便宜的原型板

作者  | 2011-4-27 14:11:06 | 阅读(96) |评论(0) | 阅读全文>>

【分析】STM32从Flash中运行程序的时序分析

2010-3-18 16:47:05 阅读139 评论0 182010/03 Mar18

大家都知道STM32的CPU时钟频率可以达到72MHz,以后还会更快,但是由于半导体制造工艺的限制,存放程序的Flash存储器不可能达到这么高的工作频率,这样当CPU直接访问Flash存储器时必须插入等待周期以得到正确的结果。

问题是在Flash的速度比CPU慢的情况下,是不是可以简单地说STM32在执行Flash中的程序时每条指令都需要插入等待周期呢?等待周期的插入对程序的执行到底有多大的影响?请看下面的分析:

首先,STM32的内部Flash是组织成64位宽度,即每次可以读出64位;在Flash与CPU的取指队列之间有两个缓冲器,用于暂存Flash中取出的指令,见下图。

其次,STM32的指令有16位的也有32位的,指令是从图中绿色的缓冲器取出;当绿色缓冲器变空时,黄色缓冲器中的内容会被复制到绿色缓冲器中;这样取指与读取Flash互不干扰。

正因为STM32的指令有不同长度,所以程序执行的等待周期与程序的内容有关。

图一是假定所有指令都是16位的指令:

1)时刻t0时黄色缓冲器和绿色缓冲器都为空,此时CPU等待3个周期后,到时刻t1时才能读到指令;

2)时刻t1时绿色缓冲器被填满,黄色缓冲器仍为空,Flash控制器继续读取后续指令;

3)时刻t2时绿色缓冲器还有两个字节,黄色缓冲器被填满;此时因为两个缓冲器都有数据,读取Flash的操作暂停(图一中的绿色虚线框所示);

4)当黄色缓冲器变空时,绿色缓冲器被复制到黄色缓冲器,同时恢复读取Flash的操作;

作者  | 2010-3-18 16:47:05 | 阅读(139) |评论(0) | 阅读全文>>

STM32 GPIO端口的输出速度设置

2010-3-18 16:46:30 阅读191 评论0 182010/03 Mar18

当STM32的GPIO端口设置为输出模式时,有三种速度可以选择:2MHz、10MHz和50MHz,这个速度是指I/O口驱动电路的速度,是用来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。

高频的驱动电路,噪声也高,当你不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。

当然如果你要输出较高频率的信号,但却选用了较低频率的驱动模块,你很可能会得到失真的输出信号。

实际上芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路。注意:GPIO的引脚速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与你的程序有关。

关键是,GPIO的引脚速度跟应用匹配。

比如对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。

对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。

对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。

作者  | 2010-3-18 16:46:30 | 阅读(191) |评论(0) | 阅读全文>>

STM32复用的GPIO引脚配置方式

2010-3-18 16:38:07 阅读776 评论0 182010/03 Mar18

STM32所有内置外设的外部引脚都是与标准GPIO引脚复用的,例如对于STM32F103VBT6,47引脚为PB10,它的复用功能是I2C2_SCL和USART3_TX,表示在上电之后它的默认功能为PB10,而I2C2的SCL和USART3的TX为它的复用功能;另外在TIM2的引脚重映射后,TIM2_CH3也成为这个引脚的复用功能。

STM32基本上每个引脚都有8种配置模式:

1)浮空输入

2)带弱上拉输入

3)带弱下拉输入

4)模拟输入

5)推挽输出

6)开漏输出

7)复用推挽输出

8)复用开漏输出

通常有5种方式使用某个引脚功能,它们的配置方式如下:

1)作为普通GPIO输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。

2)作为普通GPIO输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。

3)作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。

4)作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块。

5)作为内置外设的输出:根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块。

注意如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。

作者  | 2010-3-18 16:38:07 | 阅读(776) |评论(0) | 阅读全文>>

建立ARM开发环境之RealView MDK 安装及其破解

2010-2-25 13:29:57 阅读2606 评论1 252010/02 Feb25

RealView MDK开发套件源自德国Keil公司,是ARM公司目前最新推出的针对各种嵌入式处理器的软件开发工具。它的诞生标志着全新arm开发时代的到来,它将μvision3 ide、启动代码生成向导、设备模拟器、性能分析器、realview 编译器、mircolib、rl-arm、ulink2仿真器等多种产品模块统一融合到一个单一的平台(与arm之前的工具包ads等相比,realview编译器的最新版本可将性能改善超过20%)。目前最新版本为3.22。

安装过程比较简单,下面主要讲述如何对MDK 的 破解,以方便自己配合H-JTAG的使用。

1.1、安装MDK3.20或以它版本;

1.2、拷贝BIN文件夹到keil的安装目录下(例如c:\Keil\ARM\ 此步实际是安装ULINK1需用的DLL);

1.3、将windows文件夹拷贝到系统安装目录(例如c:\  此步其实是安装ULINK1的驱动);

1.4、打开KEIL,选择File菜单下的License Management,拷贝CID;

1.5、用KEIL_Lic.exe生成License,并注册(此为KEIL最新注册机,支持MDK3.20);

1.6、打开keil的安装目录下的TOOLS.ini文件,改成如下:

TDRV0=BIN\UL2ARM.DLL("ULINK2 ARM Debugger")

 TDRV1=BIN\UL2CM3.DLL("ULINK2 Cortex Debugger")

作者  | 2010-2-25 13:29:57 | 阅读(2606) |评论(1) | 阅读全文>>

嵌入式经典面试题(转)

2009-9-10 16:35:14 阅读186 评论0 102009/09 Sept10

嵌入式经典面试题(转)(2009-03-26 23:14:29)

标签:杂谈  分类:嵌入式LINUX

C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也是相当有趣的。

从被面试者的角度来讲,你能了解许多关于出题者或监考者的情况。这个测试只是出题者为显示其对ANSI标准细节的知识而不是技术技巧而设计吗?这是个愚蠢的问题吗?如要你答出某个字符的ASCII值。这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花时间在微机上而不是在嵌入式系统上。如果上述任何问题的答案是"是"的话,那么我知道我得认真考虑我是否应该去做这份工作。

从面试者的角度来讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者C语言的水平。不管怎么样,看一下这人如何回答他不会的问题也是满有趣。应试者是以好的直觉做出明智的选择,还是只是瞎蒙呢?当应试者在某个问题上卡住时是找

作者  | 2009-9-10 16:35:14 | 阅读(186) |评论(0) | 阅读全文>>

哈佛图书馆自习室墙上的训言

2009-9-10 16:10:54 阅读44 评论0 102009/09 Sept10

哈佛图书馆自习室墙上的训言(2009-08-25 14:27:41)

标签:杂谈  分类:其他

1.此刻打盹,你将做梦;而此刻学习,你将圆梦。

2.我荒废的今日,正是昨日殒身之人祈求的明日。

3.觉得为时已晚的时候,恰恰是最早的时候。

4.勿将今日之事拖到明日。

5.学习时的苦痛是暂时的,未学到的痛苦是终生的。

6.学习这件事,不是缺乏时间,而是缺乏努力。

7.幸福或许不排名次,但成功必排名次。

8.学习并不是人生的全部。但,既然连人生的一部分——学习也无法征服,还能做什么呢?

9.请享受无法回避的痛苦。

10.只有比别人更早、更勤奋地努力,才能尝到成功的滋味。

11.谁也不能随随便便成功,它来自彻底的自我管理和毅力。

12.时间在流逝。

13.现在淌的哈喇子,将成为明天的眼泪。

14.狗一样地学,绅士一样地玩。

15.今天不走,明天要跑。

作者  | 2009-9-10 16:10:54 | 阅读(44) |评论(0) | 阅读全文>>

mini2440外部中断按键程序

2009-9-10 16:06:11 阅读491 评论2 102009/09 Sept10

mini2440外部中断按键程序

作者:Lee

本人已测试通过,代码如下:

#include “def.h”

#include “option.h”

#include “2440addr.h”

#include “2440lib.h”

#include “2440slib.h”

#include “Uart.h”

int recnt,flag;

void GPG_Init(void)

{

rGPGCON=0×80A882;//Enable EINT[19,15,14,13,11,8],other input

rGPBUP=0×0;//pull up

}

void __irq Eint_Sv(void)

{

U32 a,b,c;

flag=1;

a=rSRCPND;

rSRCPND=a;

b=rINTPND;

rINTPND=b;

c=rEINTPEND;

rEINTPEND=c;

switch(c)

{

case 0×100:Uart_Printf(”Key1 Press!\n”);recnt=1;break;

case 0×800:Uart_Printf(”Key2 Press!\n”);recnt=2;break;

作者  | 2009-9-10 16:06:11 | 阅读(491) |评论(2) | 阅读全文>>

ARM中的RO、RW和ZI DATA说明 (转载)

2009-9-10 15:04:35 阅读107 评论0 102009/09 Sept10

ARM中的RO、RW和ZI DATA说明 (转载) 收藏

RO段、RW段和ZI段

            Posted by gavinkwoe

            一直以来对于ARM体系中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该有不少人也有和我同样的困惑,因此将我的一些关于RO,RW和ZI的理解写出来,希望能对大家有所帮助。

            要了解RO,RW和ZI需要首先了解以下知识:

            ARM程序的组成

            此处所说的“ARM程序”是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别。

            一个ARM程序包含3部分:RO,RW和ZI

            RO是程序中的指令和常量

            RW是程序中的已初始化变量

            ZI是程序中的未初始化的变量

  

作者  | 2009-9-10 15:04:35 | 阅读(107) |评论(0) | 阅读全文>>

配置ADS1.2编译mini2440程序(采用C语言编写)

2009-9-10 14:59:08 阅读418 评论0 102009/09 Sept10

前一次试验了配置ADS1.2,不过那个源文件只有一个,并且是使用汇编编写的。本次讲的是如何配置ADS1.2,并且编写简单的汇编来初始化C语言运行的环境,最后调用C语言程序。

关于ADS1.2的配置,基本配置和上一次说的一样,最不过在第六步(配置ARM Linker)就不是上次讲的那麽简单了,因为程序现在是采用多个文件:一个汇编文件,负责为调用C程序设置环境(主要是栈);另一个是使用C语言编写的程序。我们知道在多文件编译的时候,要指定程序的入口,所以本次配置ARM Linker如下:

打开DebugRel Settings(ALT + F7),选择”ARM Linker”, 选择”Linktype为Simple”,将”Simple image”的”RO Base”改为0x30000000。设置“Equvalent Command Line”为:

-info totals -entry 0x30000000 -ro-base 0x30000000 -first Init.o(Init)

说明:Init.o为Init.S编译生成的目标文件,(Init)为Init.S中的Init域(AREA Init,CODE,READONLY)。

设置好之后,我们就可以分别编写程序了。在次给出我写的程序:

Init.S

IMPORT main

CODE32

AREA Init,CODE,READONLY

ENTRY

ldr r0, =0x53000000

作者  | 2009-9-10 14:59:08 | 阅读(418) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2012

   
创建博客 登录  
 关注