基于S3C2440的U-BOOT的start.S分析

发布者:EternalSunset最新更新时间:2016-12-07 来源: eefocus关键字:S3C2440  U-BOOT  start.S 手机看文章 扫描二维码
随时随地手机看文章

在了解了ARM相关的汇编指令后,同时结合网上各位大虾的提点开始阅读u-boot的启动代码,现将分析过程记录如下
可执行文件及内存映射
我们可以把可执行文件分为2种情况:存放态和运行态
1.存放态:可执行文件经过烧到存储介质上(flash或磁盘)的分布,此时可执行文件通常有2部分组成,代码段和数据段,代码段又分为可执行代码段 (.text)和只读数据段(.rodata),数据段可以分为初始化数据段(.data)和未初始化代码段(.bss),如下:
+-------------+-----------
| .bss        | (ZI)
+-------------+-- 数据段
| .data    | (RW)
+-------------+-----------
| .rodata     |
|_____________| 代码段(RO)
| .text    |
+-------------+-----------
2.运行态:可执行文件经过装载后就变成为运行态,
当可执行文件装载后, 在RAM中的分布如下:
| ...       |
+-------------+-- ZI段结束地址
| ZI 段    |
+-------------+-- ZI段起始地址
| 保留区2     |
+-------------+-- RW段结束地址
| RW 段    |
+-------------+-- RW段起始地址
| 保留区1     |
+-------------+-- RO段结束地址
| RO 段    |
+-------------+-- RO段起始地址
所以装载过程必须完成把可执行文件的各个段搬移到RAM的指定位置,这个装载过程则是由启动程序来完成的。而可执行代码在RAM中的地址则是由链接脚本来指定的。
一个可执行的image必须有一个入口点,并且只能有一个全局入口点,所以要通知编译器这个入口在哪里。这个是有链接脚本来实现的,由此我们可以找到程序 的入口点是在 /board/lpc2210/u-boot.lds中指定的,其中ENTRY(_start)说明程序从_start开始运行,而他指向的是cpu /arm7tdmi/start.o文件。因为我们用的是ARM7TDMI的cpu架构,在复位后从地址0x00000000取它的第一条指令,所以我们 将Flash映射到这个地址上,这样在系统加电后,cpu将首先执行u-boot程序。
ARM在CPU加电复位后是从0x0000地址开始取指,因此在零地址需要放置第一条启动代码。默认情况下,程序的链接器是把0x8000作为映像的入口 点(取指的第一条指令的位置),因此 需要对映像链接定位,即重定位映像段的存放,包括代码段、数据段、零区等,对整个系统的代码做正确的定位,这些规则通常写成链接脚本。链接脚本就是提供了 一种把代码段和数据段放在不同存储器定位。
我们的只读代码和数据是固化在ROM中(通常在0x0000),但是在执行的时候想在RAM区运行(优化系统,使性能发挥最大),就需要链接定位。链接器告诉了随机存储器从哪里开始。

Load View:代码编译链接的一个组织情况
Execute View:代码正确执行的空间组织
启动过程的C部分
1. 初始化MMU
2.初始化外部端口
3. 中断处理程序表初始化
4. 串口初始化
5. 其它部分初始化(可选)
6. 主程序循环
于是我们可以在链接脚本中找到映像的加载地址,也即程序的入口点。/board/s3c2410/U-boot.lds
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000; /*映像的入口点,通常链接器将此地址定位到ROM的0x0地址,必须使编译器知道这  
个地址*/
. = ALIGN(4);
.text    :
{
cpu/arm920t/start.o (.text)
*(.text)
}
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}
从上面可以看出,链接脚本指定了代码段从0x00000000开始,而代码段最开始链接的就是cpu/arm920t/start.o。于是可以知道在CPU加电复位后程序首先是从cpu/arm920t/start.S开始的。
1.Stage1:cpu/arm920t/start.S
当系统启动时, ARM CPU会跳到0x00000000去执行。一般BootLoader都包括如下几个部分:
1. 建立中断向量异常表
2. 显示的切换到SVC且32指令模式
3. 关闭S3C2410的内部看门狗
4. 禁止所有的中断
5. 配置系统时钟频率和总线频率
6. 设置内存区的控制寄存器
7. 初始化中断
8. 安装中断向表量
9. 把可执行文件的各个段搬到运行态的各个位置
10. 跳到C代码部分执行
具体分析如下:
/*复位时0地址是ROM区,从0x0到0x20分配了ARM的中断向量表*/
.globl _start
_start: b    reset   /*0x0,正常情况下,系统reset后进入的入口,驻留于0x0地址,机器码为EA0000XX*/
ldr pc, _undefined_instruction /*0x4,未定义指令,系统出错处理的入口*/
ldr pc, _software_interrupt /*0x8,软中断,monitor程序的入口*/
ldr pc, _prefetch_abort /*0x0c,预取失败错误*/
ldr pc, _data_abort    /*0x10,取数据失败错误(通常是保护现场,然后do nothing)*/
ldr pc, _not_used        /*0x14保留*/
ldr pc, _irq          /*0x18,快速中断请求 */
ldr pc, _fiq          /*0x1c,处理原理与irq相同,所有的硬件中断源共用一个通道来进行IRQ或FIQ */
_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort:        .word data_abort
_not_used:        .word not_used
_irq:          .word irq
_fiq:          .word fiq
.balignl 16,0xdeadbeef
/*.将地址对其到16的倍数,如果PC跳过4字节才是16的倍数,则用0xdeadbeef填充,如果只跳过了1,2,3个字节则填充不确定,如果PC是16的倍数,则什么也不做*/
***************************************************************
* 当一个异常出现以后,ARM会自动执行以下几个步骤:
* (1) 把下一条指令的地址放到连接寄存器LR(通常是R14),这样就能够在处理异常返回时从正确的位置继续执行。
* (2) 将相应的CPSR(当前程序状态寄存器)复制到SPSR(备份的程序状态寄存器)中。从异常退出的时候,就可以由SPSR来恢复CPSR。
* (3) 根据异常类型,强制设置CPSR的运行模式位。
* (4) PC(程序计数器)被强制成相关异常向量处理函数地址,从而跳转到相应的异常处理程序中。
*
* 当异常处理完毕后,ARM会执行以下几步操作从异常返回:
* (1) 将连接寄存器LR的值减去相应的偏移量后送到PC中
* (2) 将SPSR复制回CPSR中
* (3) 若在进入异常处理时设置了中断禁止位,要在此清除
上述代码即碰到异常时,PC会被强制设置为对应的异常向量,从而跳转到
相应的处理程序,然后再返回到主程序继续执行。
******************************************************************
/*
*************************************************************************
*
* Startup Code (reset vector)
*
* do important init only if we don't start from memory!
* relocate armboot to ram
* setup stack
* jump to second stage
*
*************************************************************************
*/
/*保存变量的数据区*/
_TEXT_BASE:
.word TEXT_BASE
.globl _armboot_start
_armboot_start:
.word _start
/*
* These are defined in the board-specific linker script.
*/
.globl _bss_start
_bss_start:
.word __bss_start
.globl _bss_end
_bss_end:
.word _end
#ifdef CONFIG_USE_IRQ
/* IRQ stack memory (calculated at run-time) */
.globl IRQ_STACK_START
IRQ_STACK_START:
.word 0x0badc0de
/* IRQ stack memory (calculated at run-time) */
.globl FIQ_STACK_START
FIQ_STACK_START:
.word 0x0badc0de
#endif
/*****************************************************/
上述代码主要是用于保存一些全局变量,用于启动程序将代码从flash
拷贝到RAM或其他使用。有一些变量的值是通过链接脚本得到的,如
TEXT_BASE位于/u-boot-1.1.6/board/xxx(开发板目录名称)/config.mk
* 文件里。__bss_start、_end位于/u-boot-1.1.6/board/xxx(开发板目录名称)
/u-boot.lds文件里,具体值是由编译器算出来的。
/********************************************************/
/*
* the actual reset code
*/
reset:
/*
* set the cpu to SVC32 mode ,在进入时将CPSR设置为监控模式,退出后改为用户模式
* 运行模式位为:10011(svc mode) 
*/
mrs r0,cpsr
bic r0,r0,#0x1f //r0=r0 AND (!0x1f),屏蔽所有中断,为中断提供服务通常是OS的设备驱动的责任,在bootloader执行中不需要中断
orr r0,r0,#0xd3 //逻辑或
msr cpsr,r0     //svc mode
/**************************************************************************/ 
*设置cpu运行在SVC32模式。ARM共有7种模式:
* 用户模式(usr): arm处理器正常的程序执行状态
* 快速中断模式(fiq): 用于高速数据传输或通道处理
* 外部中断模式(irq): 用于通用的中断处理
* 超级保护模式(svc): 操作系统使用的保护模式
* 数据访问终止模式(abt): 当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护
* 系统模式(sys): 运行具有特权的操作系统任务
* 未定义指令中止模式(und): 当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真
* 通过设置ARM的CPSR寄存器,让CPU运行在操作系统保护模式,为后面进行其它操作作好准备了。
*************************************************************************/
/* turn off the watchdog */
#if defined(CONFIG_S3C2400)
# define pWTCON        0x15300000
# define INTMSK        0x14400008 /* Interupt-Controller base addresses */
# define CLKDIVN 0x14800014 /* clock divisor register */
#elif defined(CONFIG_S3C2410)
# define pWTCON        0x53000000
# define INTMSK        0x4A000008 /* Interupt-Controller base addresses */
# define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014 /* clock divisor register */
#endif
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
ldr     r0, =pWTCON
mov     r1, #0x0
str     r1, [r0]     //各个硬件还未就绪,关闭看门狗
/*
* mask all IRQs by setting all bits in the INTMR - default
*/
mov r1, #0xffffffff
ldr r0, =INTMSK
str r1, [r0]
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
/* FCLK:HCLK:PCLK = 1:2:4 */ //FCLK用于CPU,HCLK用于AHB,PCLK用于APB
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif /* CONFIG_S3C2400 || CONFIG_S3C2410 */
/*初始化代码在系统重启的时候调用,运行时热复位从RAM中启动不执行
* we do sys-critical inits only at reboot,
* not when booting from ram!
*/
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit //初始化CPU
#endif
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate:             /* 重定位 U-Boot 到 RAM */
adr r0, _start        /* r0 

/* 初始化堆栈        */
stack_setup:
ldr r0, _TEXT_BASE        /* upper 128 KiB: relocated uboot */
sub r0, r0, #CFG_MALLOC_LEN /* malloc area                   */
sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                      */
#ifdef CONFIG_USE_IRQ
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif                   
sub sp, r0, #12        /* leave 3 words for abort-stack */
/*得到最终sp的值*/
clear_bss:
ldr r0, _bss_start        /* find start of bss segment        */
ldr r1, _bss_end        /* stop here                      */
mov     r2, #0x00000000        /* clear                         */
clbss_l:str r2, [r0]        /* clear loop...                    */
add r0, r0, #4
cmp r0, r1
ble clbss_l                
/**********************************************************************/
* 已经准备好了堆栈,就可跳到C写的代码里了,也就是
* 跳到内存中的/u-boot-1.1.4/board.c --> start_armboot中运行了
* 把_start_armboot地址处的值也就是start_armboot绝对地址值移到pc
* 于是跳到C代码。
/*********************************************************************/
ldr pc, _start_armboot
_start_armboot: .word start_armboot
/*
*************************************************************************
*
* CPU_init_critical registers
*
* setup important registers
* setup memory timing
*
*************************************************************************
*/
cpu_init_crit:
/*
* flush v4 I/D caches
*/
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
/*使I/D cache失效: 协处理寄存器操作,将r0中的数据写入到协处理器p15的c7中,c7对应cp15的cache控制寄存器*/
mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
/*使TLB操作寄存器失效:将r0数据送到cp15的c8、c7中。C8对应TLB操作寄存器*/
/******************************************************************************************************
* MCR 指令用于将ARM 处理器寄存器中的数据传送到协处理器寄存器中,格式为:
* MCR 协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2。
* 其中协处理器操作码1 和协处理器操作码2 为协处理器将要执行的操作,
* 源寄存器为ARM 处理器的寄存器,目的寄存器1 和目的寄存器2 均为协处理器的寄存器。
******************************************************************************************************/
/*
* disable MMU stuff and caches,禁止MMU和caches
*/
mrc p15, 0, r0, c1, c0, 0   //将c1、c0的值写入到r0中
bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
orr r0, r0, #0x00000002 @ set bit 2 (A) Align
orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
mcr p15, 0, r0, c1, c0, 0   //将设置好的r0值写入到协处理器p15的c1、c0中
/*
* before relocating, we have to setup RAM timing
* because memory timing is board-dependend, you will
* find a lowlevel_init.S in your board directory.
*/
mov ip, lr //保存前一个跳转地址,防止下一个跳转将前一个lr地址覆盖
bl lowlevel_init //board/smdk2410/lowlevel_init.S:用于完成芯片存储器的初始化
mov lr, ip
mov pc, lr //返回cpu_init_crit函数
2.Stage2:lib_arm/board.c
此文件是u-boot Stage2部分,入口为Stage1最后调用的start_armboot函数。注意上面最后ldr到pc的是_start_armboot这个地址,而非start_armboot变量。
start_armboot是U-Boot执行的第一个C语言函数,完成如下工作:
1. 初始化MMU
2.初始化外部端口
3. 中断处理程序表初始化
4. 串口初始化
5. 其它部分初始化(可选)
6. 主程序循环
void start_armboot (void)
{
DECLARE_GLOBAL_DATA_PTR;
//此宏定义了一个gd_t类型的指针 *gd,并指名用r8寄存器来存储:
#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8")
ulong size;
init_fnc_t **init_fnc_ptr;
char *s;
/* Pointer is writable since we allocated a register for it     上面那个宏的作用*/
gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
//
此C语句引用的是start.S中的地址标号_armboot_start,但是得到的却是其中所指的变量_start的值(在RAM中,_start
= 0x33F80000)。 Ps: _armboot_start: .word _start
//gd是全局变量,位置在堆栈区以下(低地址):
typedef struct global_data {
bd_t *bd;
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
unsigned long reloc_off; /* Relocation Offset */    
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long fb_base; /* base address of frame buffer */
#ifdef CONFIG_VFD
unsigned char vfd_type; /* display type */
#endif
#if 0
unsigned long cpu_clk; /* CPU clock in Hz! */
unsigned long bus_clk;
unsigned long ram_size; /* RAM size */
unsigned long reset_status; /* reset status register at boot */
#endif
void **jt; /* jump table */
} gd_t;
/* compiler optimization barrier needed for GCC >= 3.4 */
__asm__ __volatile__("": : :"memory");
memset ((void*)gd, 0, sizeof (gd_t));
gd->bd = (bd_t*)((char*)gd - sizeof(bd_t)); //得到bd的起点
memset (gd->bd, 0, sizeof (bd_t));
monitor_flash_len = _bss_start - _armboot_start;
/* 顺序执行init_sequence数组中的初始化函数 */
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
hang ();
}
}
/*配置可用的Flash */
size = flash_init ();        //初始化Nor flash的函数,函数实现在下面
display_flash_config (size); //打印到控制台:Flash: 512 kB
/* _armboot_start 在u-boot.lds链接脚本中定义 */
mem_malloc_init (_armboot_start - CFG_MALLOC_LEN);        //将CFG_MALLOC_LEN区域用memset函数清零(直接往目的地址写0)
/* 配置环境变量,重新定位 */
env_relocate ();        //刚才的初始化函数中有一个是env_init(),根据CRC校验来初始化gd->env_addr变量(自己设定的还是初始值),此函 数是作用是将环境变量值从某个flash和RAM之间的拷贝。下图描述了ENV的初始化过程:

/* 从环境变量中获取IP地址,放到全局变量gd中 */
gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
/* 以太网接口MAC 地址,放到全局变量gd中*/
{
int i;
ulong reg;
char *s, *e;
uchar tmp[64];
i = getenv_r ("ethaddr", tmp, sizeof (tmp));
s = (i > 0) ? tmp : NULL;
for (reg = 0; reg   6; ++reg) {
gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0;
if (s)
s = (*e) ? e + 1 : e;
}
}
devices_init (); /* 获取列表中的设备 */
jumptable_init ();
console_init_r (); /* 完整地初始化控制台设备 */
enable_interrupts (); /* 使能例外处理 */
/* 通过环境变量初始化 */
if ((s = getenv ("loadaddr")) != NULL) {
load_addr = simple_strtoul (s, NULL, 16);
}
/* main_loop()总是试图自动启动,循环不断执行 */
for (;;) {
main_loop (); /* 主循环函数处理执行用户命令 -- common/main.c */
}
/* NOTREACHED - no way out of command loop except booting */
}

关键字:S3C2440  U-BOOT  start.S 引用地址:基于S3C2440的U-BOOT的start.S分析

上一篇:mini2440的LEDS驱动程序和测试程序详解
下一篇:关于用H-JTAG烧写mini2440不能识别NorFlash型号问题

推荐阅读最新更新时间:2024-03-16 15:23

S3C2440开发板上BMP图片的显示之一
一、BMP图片的格式分析 1、BMP文件的大致组成 BMP文件的数据由四个部分组成:位图文件头部、位图信息头部、彩色表和图像数据阵列字节。其中彩色表不是必须的,比如24位真彩色位图就没有彩色表。 (1)位图文件头部的组成(前面14个字节) (2)位图信息头部的组成(从14字节开始,14-53共40个字节) (3)下面以一个文件的分解为例,加深对各个分量的理解。 第一个文件为 160x128,24位真彩色,用Ultraedit获得其头部如下: 分析的信息填入上面表格的第三栏和第四栏。 对于BMP最重要的几个信息如上表用红色标注出来的。 文件头14个字节,主要是“BM”标注,文件大小等于61994个字节,最重要的是指出了图
[单片机]
u-boot-2014.10移植(2)设置时钟/SDRAM
时钟修改 vim arch/arm/cpu/arm920t/start.S # if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) ldr r1, =0x3ff ldr r0, =INTSUBMSK str r1, /* FCLK:HCLK:PCLK = 1:2:4 */ /* default FCLK is 120 MHz ! */ ldr r0, =CLKDIVN mov r1, #5 str r1, /* add by Flinn */
[单片机]
arm9(s3c2440)jlink烧写uboot
笔者开发环境:操作系统 win7,开发板GT2440,电脑没有串口,用的u转串口(本文简要摘录,并整理相关资源) 1.连接pc和jlink和开发板 2.安装jlink驱动,配置jlink 3.开发板打到nor flash启动方式,启动开发板 ARM学习笔记之Jlink烧写Uboot: 下载jlink驱动JLINK-V7安装包。解压后找到驱动安装。双击默认安装 安装完后在桌面会出现两个图标 安装完成可以桌面出现两个快捷图标,J-Link ARM 可以用来进行设置和测试,下面我们看一下J-LINK 的测试数据双击J-link ARM在没有连接开发板时出现如下的界面: 如果连接开发板后出现界面如下:说明jlink连上板子
[单片机]
arm9(<font color='red'>s3c2440</font>)jlink烧写uboot
u-boot移植(七)---代码修改---存储控制器
一、CPU访问芯片的条件      CPU通过访问存储控制器,来读取外部设备的数据。   CPU想访问一个芯片,需要如下条件(配置信息): 地址线 数据线:8位/16位/32位数据宽度 时钟/频率  其他芯片相关的特性:比如SDRAM,有行地址、列地址和bank   SDRAM的访问和表格检索的原理一样,先指定一个行(Row),再指定一个列(Columu),就可以准确找到所需要的单元格。这个单元格称为存储单元,这个表格(存储阵列)就是逻辑Bank(Logical Bank,即L-Bank),SDRAM一般含有4个L-bank。        只有配置好了存储管理器,才知道如何去访问外部的设备。 二、存储控制器
[单片机]
<font color='red'>u-boot</font>移植(七)---代码修改---存储控制器
S3C2440—9.复制程序到SDRAM中执行
一.S3C2440的启动方式 S3C2440的MMU有一种“steppingstone”.技术,是协助MCU从无法执行程序的NAND FLASH执行启动程序的一种方法,其启动步骤如下: 1、系统上电后,首先自动判断是否是autoboot模式,如果使用 s3c2440是带有nandflash的,并且被设置成autoboot,从nandflash开始启动. 2、在判断是autoboot模式后,mcu内置的nandflash控制器自动将nandflash的最前面的4k区域(这4k区域存放着 bootloader的最前面4k代码)拷贝到samsung所谓的 steppingstone 里面(steppingstone是在S3C2440
[单片机]
S3C2440上RTC时钟驱动开发实例讲解
一、开发环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二、相关概念 1、平台设备: 通常在Linux中,把SoC系统中集成的独立外设单元(如:I2C、IIS、RTC、看门狗等)都被当作平台设备来处理。在Linux中用platform_device结构体来描述一个平台设备,在2.6.30.4内核中定义在:include/linux/platform_device.h中,如下: struct platform_device { const char * name;
[单片机]
S3C2440芯片时钟配置
S3C2440A芯片中的时钟控制逻辑可以生成所需的时钟信号,包括用于CPU的FCLK、AHB (Advanced High-performance Bus) 总线外围设备的HCLK,以及APB (Advanced Peripheral Bus)总线外围设备的PCLK。S3C2440A有两个相锁循环(PLLs):一个用于FCLK、HCLK和PCLK,另一个用于USB块(48 Mhz)。时钟控制逻辑可以使用无PLL的慢时钟,并且可以通过软件控制决定将时钟是否连接到外围块,这将减少芯片的功耗。 1 时钟源的选择 S3C2440A芯片的时钟来源有两个,一个是外部晶振(XTIpll 和 XTOpll),一个来自外部时钟输入(EXTC
[单片机]
<font color='red'>S3C2440</font>芯片时钟配置
基于LabVIEW的手持数字波形表的界面设计
  将LabVIEW设计的虚拟仪器程序移植到运行WindowsCE的便携式手持设备上。可以极大地提高嵌入式系统软件开发效率。具体提出一种有效解决数据波形交替显示的界面设计,阐述了如何使用LabVIEW的触摸屏toueh panel模块开发的数字波形表用于Windows CE 5.0设备的测试项目的案例。    1 开发平台简介   1.1 基础平台   本文设计的数字波形表采用高性能、低功耗、高集成度的S3C2440A微处理器。触摸屏配合采用S3C2440A的高速处理器驱动,具有更好的视频显示效果。   1.2 软件平台   LabVIEW是美国国家仪器公司推出的一种虚拟仪器开发平台。LabVIEW包含有很多的模块,to
[测试测量]
基于LabVIEW的手持数字波形表的界面设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved