文档库 最新最全的文档下载
当前位置:文档库 › 浅析eCos系统Redboot单元启动流程

浅析eCos系统Redboot单元启动流程

浅析eCos系统Redboot单元启动流程
浅析eCos系统Redboot单元启动流程

浅析eCos系统Redboot单元启动流程

packages/hal/arm/arch/v2_0/src/vectors.S

install/lib/target.ld|1| STARTUP(vectors.o)//入口文件

install/lib/target.ld|2| ENTRY(reset_vector)//入口段

//packages/redboot/v2_0/src/main.c|178| cyg_start(void)

.code 32

.section ".vectors","ax"

#ifdef PLATFORM_PREAMBLE

PLATFORM_PREAMBLE //而ep93xx恰好就定义了该宏packages/hal/arm/arm9/ep93xx/v2_0/include/hal_platform_setup.h

/*

#define PLATFORM_PREAMBLE _platform_preamble

#if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)

.macro _platform_preamble

b start_here

......

// Put the current literal pool here.

.ltorg

// Put a "CRUS" at offset 0x1000 so that the boot ROM will boot this image.

// 在0或0x1000地址写入"CRUS"4个字符,是ep9312启动所必须[luther.gliethttp]

.org 0x1000

.long 0x53555243 // Put a CRUS in there so this is bootable.

start_here:

.endm

*/

#endif

.global __exception_handlers

__exception_handlers:

ldr pc,.reset_vector // 0x00

ldr pc,.undefined_instruction // 0x04

ldr pc,.software_interrupt // 0x08 start && software int

ldr pc,.abort_prefetch // 0x0C

ldr pc,.abort_data // 0x10

.word 0 // unused

ldr pc,.IRQ // 0x18

ldr pc,.FIQ // 0x1C

......

reset_vector:

PLATFORM_SETUP1 //对于ep93xx来说对应:packages/hal/arm/arm9/ep93xx/v2_0/include/hal_platform_setup.h

/*

#define PLATFORM_SETUP1 _platform_setup1

.macro _platform_setup1

b Setup

//and r12, pc, #0xf0000000//获取flash的基地址,因为pc现在运行在flash中,并且flash的基地址含1数一定在最高8bit中

//bl BuildPagetable //建立虚拟地址映射表

//

// Create a read-only mapping of FLASH at virtual address 0x6000_0000. //

add r1, r0, #0x00001800 //0x60000000 >> 18 这样将作为虚拟地址入口

#if defined(HAL_PLATFORM_EP9301) || defined(HAL_PLATFORM_EP9302)

mov r2, #0x00000040

#else

mov r2, #0x00000080

#endif

orr r3, r12, #0x0000001e

//将r12中flash的物理地址存入PTE虚拟地址入口为0x60000000,这样对0x60000000访问将被线性MMU到物理地址

map_flash_6:

str r3, [r1], #4

add r3, r3, #0x00100000

subs r2, r2, #4

bne map_flash_6

...

//

// Enable the MMU and branch to our equivalent virtual address.

//

ldr r0, =0xc0000079

ldr r1, =go_virtual

ldr r2, =__rom_vectors_vma

sub r1, r1, r2 //之所以进行sub操作,我的EP9312使用的是ROMRAM启动方式,

//BootROM将直接跳转到flash处执行存储在flash中的代码,flash被映射到虚拟地址0x60000000之后,

//为了还能够在0x60000000空间执行flash中的代码,那么就需要首先计算出go_virtual 偏移地址,

//然后加上flash的虚拟基地址0x60000000,这样代码才会从flash处继续顺利执行

bic r1, r1, #0xf0000000

orr r1, r1, #0x60000000

mcr p15, 0, r0, c1, c0, 0

mov pc, r1

go_virtual:

nop

#ifdef CYG_HAL_STARTUP_ROMRAM

//因为现在代码运行在rom中,所以可以安全的对整个SDRAM进行清0操作

//

// Copy our image from FLASH to SDRAM.

//

ldr r0,=__rom_vectors_lma //值为0x60000000,就是flash的虚拟地址 ldr r1,=__rom_vectors_vma //值为0x8000

ldr r2,=__ram_data_end

copy_loop:

ldmia r0!, {r3-r10} //将flash中的数据取出来

stmia r1!, {r3-r10} //转储到0x8000开始处

cmp r1, r2

blt copy_loop

//

// Zero fill the first portion of SDRAM.

//

mov r0, #0x00000000

mov r1, #0x00000000

mov r2, #0x00002000

zero:

str r0, [r1], #4 //清零0~0x4000空间的数据

subs r2, r2, #4 //0x4000~0x8000空间用来存放MMU的PTE 虚拟映射表

bne zero

//

// Branch to the copy in RAM.

//

ldr r0, =RamLocation //ok现在取出RamLocation编译地址0x8504

mov pc, r0 //执行完该句之后,程序就到被虚拟映射到0地址的SDRAM中跑了

RamLocation:

#endif

...

//完成SDRAM初始化,将flash只读地址映射到虚拟地址0x60000000,将flash读写地址映射到虚拟地址0xe0000000,熄灭green led,点亮red led,打开PLL,使能200MHz处理器时钟,使能usb时钟

//packages/hal/arm/arch/v2_0/src/arm.ld|105| __rom_vectors_lma = LOADADDR(.rom_vectors);

//packages/hal/arm/arm9/ep93xx/v2_0/include/pkgconf/mlt_arm_arm9_edb9 312_romram.ldi|15| SECTION_rom_vectors (ram, 0x8000, AT (0x60000000)) //所以这样__rom_vectors_lma = 0x60000000; __rom_vectors_vma = 0x8000该地址为ram中地址

//于是将根据下面的内容生成install/lib/target.ld

MEMORY

{

ram : ORIGIN = 0, LENGTH = 0x10000000

rom : ORIGIN = 0x60000000, LENGTH = 0x2000000 //这是rom的虚拟地址,flash 物理地址将在b Setup中被映射到0x60000000这里

}

SECTIONS

{

SECTIONS_BEGIN

SECTION_fixed_vectors (ram, 0x20, LMA_EQ_VMA)

SECTION_rom_vectors (ram, 0x8000, AT (0x60000000))//

SECTION_text (ram, ALIGN (0x4), FOLLOWING (.rom_vectors))

SECTION_fini (ram, ALIGN (0x4), FOLLOWING (.text))

SECTION_rodata (ram, ALIGN (0x4), FOLLOWING (.fini))

SECTION_rodata1 (ram, ALIGN (0x4), FOLLOWING (.rodata))

SECTION_fixup (ram, ALIGN (0x4), FOLLOWING (.rodata1))

SECTION_gcc_except_table (ram, ALIGN (0x4), FOLLOWING (.fixup))

SECTION_data (ram, ALIGN (0x4), FOLLOWING (.gcc_except_table))

SECTION_bss (ram, ALIGN (0x4), LMA_EQ_VMA)

_heap1 = ALIGN (0x8); //堆栈开始

SECTIONS_END

}

SetupReturn:

.endm

*/

warm_reset:

通过反汇编

luther@gliethttp:/vobs/tmp/luther$ arm-elf-objdump -DS -b binary -m arm install/bin/redboot.bin |more

1000: 53555243 cmppl r5,#805306372 ; 0x30000004

1004: ea00000e b 0x1044

1008: e59ff018 ldr pc,[pc,#24]; 0x1028

100c: e59ff018 ldr pc,[pc,#24]; 0x102c //读取pc+24处的handler

1010: e59ff018 ldr pc,[pc,#24]; 0x1030

1014: e59ff018 ldr pc,[pc,#24]; 0x1034

1018: 00000000 andeq r0, r0, r0

101c: e59ff018 ldr pc,[pc,#24]; 0x103c

1020: e59ff018 ldr pc,[pc,#24]; 0x1040

1024: 00000040 andeq r0, r0, r0, asr #32

1028: 00009178 andeq r9, r0, r8, ror r1

102c: 0000919c muleq r0, ip, r1

1030: 000091c8 andeq r9, r0, r8, asr #3

1034: 000091e4 andeq r9, r0, r4, ror #3

1038: 00000000 andeq r0, r0, r0

103c: 000092fc streqd r9,[r0],-ip

1040: 000092c4 andeq r9, r0, r4, asr #5

1044: eafffc9f b 0x2c8 //对应PLATFORM_SETUP1宏展开,执行Setup操作

1048: e3a00000 mov r0,#0 ; 0x0

104c: e59f13d0 ldr r1,[pc,#976]; 0x1424

1050: e5912008 ldr r2,[r1,#8]//软中断software interrupt

1054: e5802008 str r2,[r0,#8]//将verctor存储到0地址处,因为其使用ldr pc绝对跳转,所以都能实现跳转

1058: e3a00000 mov r0,#0 ; 0x0

105c: e59f13a4 ldr r1,[pc,#932]; 0x1408

1060: e5912028 ldr r2,[r1,#40]//将处理handler地址存储到0x28地址处,将由ldr pc, [pc, #24]读取

1064: e5802028 str r2,[r0,#40]

1068: e5912018 ldr r2,[r1,#24]

106c: e5802018 str r2,[r0,#24]

1070: e5912038 ldr r2,[r1,#56]

1074: e5802038 str r2,[r0,#56]

1078: e591201c ldr r2,[r1,#28]

107c: e580201c str r2,[r0,#28]

1080: e591203c ldr r2,[r1,#60]

1084: e580203c str r2,[r0,#60]

1088: e591200c ldr r2,[r1,#12]

108c: e580200c str r2,[r0,#12]

1090: e591202c ldr r2,[r1,#44]

1094: e580202c str r2,[r0,#44]

1098: e5912010 ldr r2,[r1,#16]

109c: e5802010 str r2,[r0,#16]

10a0: e5912030 ldr r2,[r1,#48]

10a4: e5802030 str r2,[r0,#48]

10a8: e3a00000 mov r0,#0 ; 0x0

10ac: e59f1354 ldr r1,[pc,#852]; 0x1408

10b0: e5912000 ldr r2,[r1]

10b4: e5802000 str r2,[r0]//将reset追加到0地址处

10b8: e59f2368 ldr r2,[pc,#872]; 0x1428

10bc: e5802020 str r2,[r0,#32]//将reset的handler改变为warm_reset存储到0x20处,以等待直接跳转方式的reset来调用

10c0: e59f3328 ldr r3,[pc,#808]; 0x13f0

//packages/hal/arm/arch/v2_0/src/arm.ld|238| __rom_data_start = LOADADDR (.data);

10c4: e59f4328 ldr r4,[pc,#808]; 0x13f4

10c8: e59f5328 ldr r5,[pc,#808]; 0x13f8

10cc: e1540005 cmp r4, r5

10d0: 0a000005 beq 0x10ec

10d4: e2433004 sub r3, r3,#4 ; 0x4

10d8: e2444004 sub r4, r4,#4 ; 0x4

10dc: e5b30004 ldr r0,[r3,#4]!//将__rom_data_start中的data数据段加载到__ram_data_start

10e0: e5a40004 str r0,[r4,#4]!

10e4: e1540005 cmp r4, r5

10e8: 1afffffb bne 0x10dc

10ec: e59fd2e4 ldr sp,[pc,#740]; 0x13d8

10f0: e3a000d2 mov r0,#210 ; 0xd2

10f4: e129f000 msr CPSR_fc, r0

10f8: e59fd2dc ldr sp,[pc,#732]; 0x13dc

10fc: e3a000db mov r0,#219 ; 0xdb

1100: e129f000 msr CPSR_fc, r0

1104: e59fd2d0 ldr sp,[pc,#720]; 0x13dc

1108: e3a000d3 mov r0,#211 ; 0xd3

110c: e129f000 msr CPSR_fc, r0

1110: e169f000 msr SPSR_fc, r0

1114: e59fd2bc ldr sp,[pc,#700]; 0x13d8

1118: e59f12c4 ldr r1,[pc,#708]; 0x13e4

111c: e59f22c4 ldr r2,[pc,#708]; 0x13e8

1120: e3a00000 mov r0,#0 ; 0x0

1124: e1510002 cmp r1, r2

1128: 0a000002 beq 0x1138

112c: e4810004 str r0,[r1],#4 //对bbs段进行清0操作

1130: e1510002 cmp r1, r2

1134: 9afffffc bls 0x112c

1138: eb001eb6 bl 0x8c18 //bl hal_hardware_init 包含打开串口输出功能

/*

hal_virtual_vector_table[]这个表就像是linux下的syscall系统调用,直接调用hal_virtual_vector_table[]中的项就可以执行所要的功能函数

比如:CYGACC_CALL_IF_DELAY_US_SET(delay_us);

static void

delay_us(cyg_int32 usecs)

{

CYGARC_HAL_SAVE_GP();

#ifdef CYGPKG_KERNEL

...

#else // CYGPKG_KERNEL

#ifdef HAL_DELAY_US

HAL_DELAY_US(usecs);

//packages/hal/arm/arm9/ep93xx/v2_0/include/hal_diag.h ==> #define HAL_DELAY_US(n) hal_delay_us(n);

//packages/hal/arm/arm9/ep93xx/v2_0/src/ep93xx_misc.c ==> void hal_delay_us(cyg_int32 usecs)

#else

while (usecs-- > 0) {

int i;

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

}

#endif // HAL_DELAY_US

#endif // CYGPKG_KERNEL

CYGARC_HAL_RESTORE_GP();

}

*/

113c: eb00258d bl 0xa778 //bl initialize_stub 会从定义的uart口打印出一个'+'字符

//putDebugChar ('+');

// __call_if_debug_procs_t __debug_procs = CYGACC_CALL_IF_DEBUG_PROCS();

// CYGACC_COMM_IF_PUTC(*__debug_procs, c);//执行子函数CYGNUM_COMM_IF_PUTC

1140: e3a00000 mov r0,#0 ; 0x0

1144: e59f12d8 ldr r1,[pc,#728]; 0x1424

1148: e5912004 ldr r2,[r1,#4]

114c: e5802004 str r2,[r0,#4]

1150: e5912024 ldr r2,[r1,#36]

1154: e5802024 str r2,[r0,#36]

1158: eb002d0b bl 0xc58c //bl hal_ctrlc_isr_init

115c: eb001e9a bl 0x8bcc //bl cyg_hal_invoke_constructors

/*

//执行c++中对象们各自的构造函数

packages/hal/arm/arch/v2_0/src/arm.ld|233| __CTOR_LIST__ = ABSOLUTE (.); KEEP (*(SORT (.ctors*))) __CTOR_END__ = ABSOLUTE (.);

void cyg_hal_invoke_constructors (void)

{

pfunc *p;

for (p = &__CTOR_END__[-1]; p >= __CTOR_LIST__; p--)

(*p) ();//我打印p为000363a8,*p内容为000158e8,也就是他的跳转地址为000158e8

}

经过反汇编

luther@gliethttp:/vobs/tmp/ep9312$ arm-elf-objdump -DS ./infra/v2_0/src/infra_diag.o |more

...

00000000 <_GLOBAL__I.10100_diag_write_char>:

0: e52de004 str lr, [sp, -#4]!

4: e3a01d9d mov r1, #10048 ; 0x2740

8: e2811034 add r1, r1, #52 ; 0x34

c: e3a00001 mov r0, #1 ; 0x1

10: e49de004 ldr lr, [sp], #4

14: eafffffe b 0 <_GLOBAL__I.10100_diag_write_char>

Disassembly of section .ctors.55435: //上面就是.ctors*段,所以将被添加到__CTOR_LIST__代表的KEEP (*(SORT (.ctors*)))段空间.

00000000 <.ctors.55435>:

0: 00000000 andeq r0, r0, r0

...

luther@gliethttp:/vobs/tmp/ep9312$ arm-elf-objdump -DS install/bin/redboot.elf |more

发现158e8地址处的类构造函数地址:

class Cyg_dummy_diag_init_class {

public:

Cyg_dummy_diag_init_class() {

HAL_DIAG_INIT();

}

};

static Cyg_dummy_diag_init_class cyg_dummy_diag_init_obj

CYGBLD_ATTRIB_INIT_AFTER(CYG_IN IT_HAL);//产生静态对象,将自己添加到__CTOR_LIST__构造函数空间区.

000363a8 <__NETDEVTAB_END__>:

363a8: 000158e8 andeq r5, r1, r8, ror #17

000158c8 <_Z41__static_initialization_and_destruction_0ii>:

158c8: e3a03d9d mov r3, #10048 ; 0x2740

158cc: e2833034 add r3, r3, #52 ; 0x34

158d0: e1510003 cmp r1, r3

158d4: 03500001 cmpeq r0, #1 ; 0x1

}

158d8: e52de004 str lr, [sp, -#4]!

158dc: 149df004 ldrne pc, [sp], #4

158e0: e49de004 ldr lr, [sp], #4

158e4: eafffb17 b 14548 //跳转到hal_if_diag_init()函数初始化diag,主要是完成gdb的控制函数

//填充,CYGNUM_CALL_IF_SET_COMM_ID_MANGLER对应comm_channels[0],也就是gdb使用的空间

//cyg_hal_diag_mangler_gdb_init()就是完成comm_channels[0]控制函数填充的函数.

//如果想在这里开始就调用diag_printf("hello\n");来打印数据,那还不行,必须调用diag_init_putc(_mon_write_char);设置

//diag_printf的串口数据输出回调函数才行,如果想更早打印数据,那么可以这样修改:

//static void _mon_write_char(char c, void **param)去掉static,然后

//externC void _mon_write_char(char c, void **param);

//void hal_hardware_init(void)

//{

// diag_init_putc(_mon_write_char); 在该函数中追加此行

// plf_hardware_init();

// hal_if_init();//在执行完该句之后就可以安全使用diag_printf打印数据了.

*/

1160: eb003266 bl 0xdb00 //bl cyg_start //进入redboot的c 主函数

hal_if_init

==> CYGACC_CALL_IF_DELAY_US_SET(delay_us);//设置时间调用函数体

CYGACC_CALL_IF_FLASH_CFG_OP_SET(flash_config_op);//设置flash配置调用函数体

set_debug_comm(CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL);

CYGACC_CALL_IF_SET_DEBUG_COMM_SET(set_debug_comm);

CYGACC_CALL_IF_SET_CONSOLE_COMM_SET(set_console_comm);

CYGACC_CALL_IF_VERSION_SET(CYGNUM_CALL_IF_TABLE_VERSION_CALL |((CYG_ADDRWORD)CYGNUM_CALL_IF_TABLE_VERSION_COMM<

CYGACC_CALL_IF_RESET_SET(reset);

CYGACC_CALL_IF_KILL_VECTOR_SET(kill_by_reset);

CYGACC_CALL_IF_FLUSH_ICACHE_SET(flush_icache);

CYGACC_CALL_IF_FLUSH_DCACHE_SET(flush_dcache);

//packages/redboot/v2_0/src/main.c|178| cyg_start(void)

/*

CYG_HAL_TABLE_BEGIN( __RedBoot_INIT_TAB__, RedBoot_inits );//__RedBoot_INIT_TAB__指向.ecos.table.RedBoot_inits.begin首地址

CYG_HAL_TABLE_END( __RedBoot_INIT_TAB_END__, RedBoot_inits );

#define _RedBoot_init(_f_,_p_) \

struct init_tab_entry _init_tab_##_p_##_f_ \

CYG_HAL_TABLE_QUALIFIED_ENTRY(RedBoot_inits,_p_##_f_) = { _f_ }; //登记到.ecos.table.RedBoot_inits.data节

#define RedBoot_init(_f_,_p_) _RedBoot_init(_f_,_p_) //定义函数RedBoot_init

for (init_entry = __RedBoot_INIT_TAB__; init_entry != &__RedBoot_INIT_TAB_END__; init_entry++) {

(*init_entry->fun)();

//do_flash_init

//load_flash_config

//net_init

}

packages/redboot/v2_0/src/flash.c|1235| RedBoot_init(_do_flash_init, RedBoot_INIT_FIRST);//所以这些都是将会被自动执行的function

packages/redboot/v2_0/src/flash.c|2118|

RedBoot_init(load_flash_config, RedBoot_INIT_FIRST);

packages/redboot/v2_0/src/fs/ide.c|489| RedBoot_init(ide_init, RedBoot_INIT_FIRST);

packages/redboot/v2_0/src/decompress.c|104| RedBoot_init(_zlib_init, RedBoot_INIT_FIRST);

packages/redboot/v2_0/src/net/net_io.c|575| RedBoot_init(net_init, RedBoot_INIT_LAST);

packages/redboot/v2_0/include/redboot.h|251| #define RedBoot_init(_f_,_p_) _RedBoot_init(_f_,_p_)

luther@gliethttp:/vobs/tmp/ep9312$ arm-elf-objdump -DS ./redboot/v2_0/src/redboot_flash.o |more

...

Disassembly of section .ecos.table.FIS_cmds.data.fis_init:

00000000 <_cmd_tab_fis_init>:

0: 00000004 andeq r0, r0, r4

4: 0000000c andeq r0, r0, ip

8: 00000030 andeq r0, r0, r0, lsr r0

...

cyg_start

==>if ((cmd = parse(&command, &argc, &argv[0])) != (struct cmd *)0) ==>return cmd_search(__RedBoot_CMD_TAB__, &__RedBoot_CMD_TAB_END__, argv[0]);//遍历__RedBoot_CMD_TAB__指向section为.ecos.table的存储节中的所有handler处理函数

packages/redboot/v2_0/src/flash.c|173| RedBoot_nested_cmd("fis", //string名为"fis"

//fis命令,其自身添加到命令为RedBoot_commands的__RedBoot_CMD_TAB__所在节

"Manage FLASH images",

"{cmds}",

do_fis,

__FIS_cmds_TAB__, &__FIS_cmds_TAB_END__

);

CYG_HAL_TABLE_BEGIN(__FIS_cmds_TAB__, FIS_cmds);//在.ecos.table.节中定

义名为FIS_cmds的管理区,即.ecos.table.FIS_cmds节

所有需要被do_fis函数使用的local_cmd_entry命令功能函数都需要将自己添加到名为FIS_cmds管理区,

所以这样看起来就像是一个二维数组或者多维数组

RedBoot> fis load ramdisk

对应的存储结构二维表为:

__RedBoot_CMD_TAB__["fis"] ==> do_fis

==> cmd_search(__FIS_cmds_TAB__)

__FIS_cmds_TAB__["load"] ==> fis_load

__RedBoot_CMD_TAB__["fis"]["load"]

__RedBoot_CMD_TAB__["fis"]["create"]

#define CYGARC_P2ALIGNMENT 2

#ifndef CYG_HAL_TABLE_BEGIN

#define CYG_HAL_TABLE_BEGIN(_label, _name) \

__asm__(".section \".ecos.table." __xstring(_name) ".begin\",\"aw\"\n" \

".globl " __xstring(CYG_LABEL_DEFN(_label)) "\n" \

".type " __xstring(CYG_LABEL_DEFN(_label)) ",object\n" \

".p2align " __xstring(CYGARC_P2ALIGNMENT) "\n" \

__xstring(CYG_LABEL_DEFN(_label)) ":\n" \

".previous\n" \

)

#endif

展开就是:

.section ".ecos.table.FIS_cmds.begin","aw"

.globl __FIS_cmds_TAB__

.type __FIS_cmds_TAB__,object //表示__FIS_cmds_TAB__这个标量表示的是一个对象,用来索引数据,而不是函数

.p2align 2

__FIS_cmds_TAB__:

.previous

下面是.previous的一行英文解释:

The .PREVIOUS directive instructs the assembler to set the current section in memory to the section described immediately before the current one. The .PREVIOUS directive operates on a stack.

就像

ENTRY(begin)

SECTION

{

.=0x10000000;

.text:{*(.text)}

.data:{*(.data)}

.bss:{*(.bss)}

}

.section ".ecos.table.FIS_cmds.begin","aw"用来说明这里是.ecos.table.FIS_cmds段的begin起始地址处,

.ecos.table.FIS_cmds.data.fis_load 向这里就是表示.ecos.table.FIS_cmds段中的data区的.fis_load域.

#ifndef CYG_HAL_TABLE_ENTRY

#define CYG_HAL_TABLE_ENTRY( _name ) \

CYGBLD_ATTRIB_SECTION(".ecos.table." __xstring(_name) ".data") #endif

#ifndef CYG_HAL_TABLE_QUALIFIED_ENTRY

#define CYG_HAL_TABLE_QUALIFIED_ENTRY( _name, _qual ) \

CYGBLD_ATTRIB_SECTION(".ecos.table." __xstring(_name) ".data." \

__xstring(_qual)) //建立名为".ecos.table.RedBoot_commands.data.do_fis"的节

#endif

RedBoot> fis load ramdisk

fis_load

==>fis_lookup

fis_create

packages/redboot/v2_0/src/flash.c|86|

local_cmd_entry("init",

"Initialize FLASH Image System [FIS]",

"[-f]",

fis_init,

FIS_cmds //由名为FIS_cmds管理区管理

);

packages/redboot/v2_0/src/flash.c|97|

local_cmd_entry("list",

local_cmd_entry("list",

"Display contents of FLASH Image System [FIS]",

FIS_LIST_OPTS,

fis_list,

FIS_cmds //由名为.ecos.table.FIS_cmds节管理区管理packages/redboot/v2_0/src/flash.c|122|

local_cmd_entry("load",

"Load image from FLASH Image System [FIS] into RAM", fis_load_usage,

fis_load,

FIS_cmds

packages/redboot/v2_0/src/flash.c|128|

local_cmd_entry("create",

"Create an image",

"-b -l [-s ]\n" " [-f ] [-e ] [-r ] [-n] ",

fis_create,

FIS_cmds

packages/redboot/v2_0/src/flash.c|138|

local_cmd_entry("erase",

"Erase FLASH contents",

"-f -l ",

fis_erase,

FIS_cmds

packages/redboot/v2_0/src/flash.c|158|

local_cmd_entry("write",

"Write raw data directly to FLASH",

"-f -b -l ",

fis_write,

FIS_cmds

packages/redboot/v2_0/include/redboot.h|235| #define local_cmd_entry(_s_,_h_,_u_,_f_,_n_)

local_cmd_entry("load",

"Load image from FLASH Image System [FIS] into RAM", fis_load_usage,

fis_load,

FIS_cmds

packages/redboot/v2_0/src/main.c|119|

CYG_HAL_TABLE_BEGIN( __RedBoot_CMD_TAB__, RedBoot_commands );

#define CYG_HAL_TABLE_BEGIN( _label, _name ) \

__asm__(".section \".ecos.table." __xstring(_name) ".begin\",\"aw\"\n" \

".globl " __xstring(CYG_LABEL_DEFN(_label)) "\n" \

".type " __xstring(CYG_LABEL_DEFN(_label)) ",object\n" \

".p2align " __xstring(CYGARC_P2ALIGNMENT) "\n" \

__xstring(CYG_LABEL_DEFN(_label)) ":\n" \

".previous\n" \

)

#endif

所以可以看到__RedBoot_CMD_TAB__就是指向section 为.ecos.table.RedBoot_commands的存储节.

#ifndef CYG_HAL_TABLE_QUALIFIED_ENTRY

#define CYG_HAL_TABLE_QUALIFIED_ENTRY( _name, _qual ) \

CYGBLD_ATTRIB_SECTION(".ecos.table." __xstring(_name) ".data." \

__xstring(_qual))

#endif

#define RedBoot_cmd(_s_,_h_,_u_,_f_) cmd_entry(_s_,_h_,_u_,_f_,0,0,RedBoot_commands)

#define RedBoot_nested_cmd(_s_,_h_,_u_,_f_,_subs_,_sube_) cmd_entry(_s_,_h_,_u_,_f_,_subs_,_sube_,RedBoot_commands)

#define _cmd_entry(_s_,_h_,_u_,_f_,_subs_,_sube_,_n_) \

cmd_fun _f_; \

struct cmd _cmd_tab_##_f_ CYG_HAL_TABLE_QUALIFIED_ENTRY(_n_,_f_) = {_s_, _h_, _u_, _f_, _subs_, _sube_};

#define cmd_entry(_s_,_h_,_u_,_f_,_subs_,_sube_,_n_) \

extern _cmd_entry(_s_,_h_,_u_,_f_,_subs_,_sube_,_n_)

#define local_cmd_entry(_s_,_h_,_u_,_f_,_n_) \

static _cmd_entry(_s_,_h_,_u_,_f_,0,0,_n_)

packages/redboot/v2_0/src/flash.c|1563| RedBoot_cmd("fconfig", packages/redboot/v2_0/src/flash.c|1703| RedBoot_cmd("alias",

packages/redboot/v2_0/src/fs/disk.c|68| RedBoot_cmd("disks",

packages/redboot/v2_0/src/net/net_io.c|716|

RedBoot_cmd("ip_address",

packages/redboot/v2_0/src/net/ping.c|63| RedBoot_cmd("ping",

packages/redboot/v2_0/src/dump.c|58| RedBoot_cmd("dump",

packages/redboot/v2_0/src/dump.c|63| RedBoot_cmd("x",

packages/redboot/v2_0/src/load.c|80| RedBoot_cmd("load",

packages/redboot/v2_0/src/mcmp.c|58| RedBoot_cmd("mcmp",

packages/redboot/v2_0/src/caches.c|61| RedBoot_cmd("cache",

packages/redboot/v2_0/src/io.c|67| RedBoot_cmd("channel",

packages/redboot/v2_0/src/io.c|73| RedBoot_cmd("channel",

packages/redboot/v2_0/src/main.c|84| RedBoot_cmd("version",

packages/redboot/v2_0/src/main.c|89| RedBoot_cmd("help",

packages/redboot/v2_0/src/main.c|94| RedBoot_cmd("go",

packages/redboot/v2_0/src/main.c|100| RedBoot_cmd("reset",

packages/redboot/v2_0/src/main.c|107| RedBoot_cmd("baudrate", packages/redboot/v2_0/src/mfill.c|58| RedBoot_cmd("mfill",

packages/redboot/v2_0/src/cksum.c|60| RedBoot_cmd("cksum",

packages/redboot/v2_0/include/redboot.h|228| #define RedBoot_cmd(_s_,_h_,_u_,_f_)

cmd_entry(_s_,_h_,_u_,_f_,0,0,RedBoot_commands)

*/

//如果是eCos感觉应该是

//packages/infra/v2_0/src/startup.cxx|92| cyg_start( void )

1164: eafffffe b 0x1164 //bl _start_hang

......

以上进行vectors的向量表搬移和向量表对应的handler搬移

packages/hal/arm/arch/v2_0/src/vectors.S这是执行的0地址文件

==>hal_hardware_init

==>hal_if_init

==>cyg_hal_plf_comms_init

==>cyg_hal_plf_serial_init

==>cyg_hal_plf_serial_init_channel

==>EnableUART

int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_ QUERY_CURRENT);//执行类似linux系统调用的函数调用

展开之后就是

int cur = __call_vv_CYGNUM_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SE T_COMM_ID_QUERY_CURRENT);

#define CYGACC_CALL_VV1(t,e,p1) __call_vv_##e((p1))

#define __call_VV1(_n_,_tt_,_rt_,_t1_) \

static__inline__ _rt_ \

__call_vv_##_n_(_t1_ _p1_) \

{ \

_rt_ res; \

_ENTER_MONITOR(); \

res =((_tt_ *)hal_virtual_vector_table[_n_])(_p1_); \

_EXIT_MONITOR(); \

return res; \

}

#define CYGACC_CALL_IF_SET_CONSOLE_COMM(_i_) \

CYGACC_CALL_VV1(__call_if_set_console_comm_t*, CYGNUM_CALL_IF_SET_CO NSOLE_COMM,(_i_))

__call_VV1(CYGNUM_CALL_IF_SET_CONSOLE_COMM, __call_if_set_console_com m_t,int,int)

#define CYGNUM_CALL_IF_SET_CONSOLE_COMM 13

展开之后为

static__inline__int

__call_vv_CYGNUM_CALL_IF_SET_CONSOLE_COMM(int _p1_)

{

int res;

_ENTER_MONITOR();

res =((__call_if_set_console_comm_t *)hal_virtual_vector_table[1 3])(_p1_);

//该函数指针就是CYGACC_CALL_IF_SET_CONSOLE_COMM_SET(set_console_comm);设置的函数set_console_comm

//#define CYGACC_CALL_IF_SET_CONSOLE_COMM_SET(_x_) \

//

hal_virtual_vector_table[CYGNUM_CALL_IF_SET_CONSOLE_COMM]=(CYG_ADDRWO RD)(_x_)

_EXIT_MONITOR();

return res;

}

#define CYGACC_CALL_IF_SET_CONSOLE_COMM_SET(_x_) \

hal_virtual_vector_table[CYGNUM_CALL_IF_SET_CONSOLE_COMM]=(CYG_ADDRW ORD)(_x_)

#define CYGNUM_COMM_IF_CH_DATA 0

#define CYGNUM_COMM_IF_WRITE 1

#define CYGNUM_COMM_IF_READ 2

#define CYGNUM_COMM_IF_PUTC 3

#define CYGNUM_COMM_IF_GETC 4

#define CYGNUM_COMM_IF_CONTROL 5

#define CYGNUM_COMM_IF_DBG_ISR 6

#define CYGNUM_COMM_IF_GETC_TIMEOUT 7

#define CYGNUM_COMM_IF_TABLE_SIZE 8

typedef volatile CYG_ADDRWORD

hal_virtual_comm_table_t[CYGNUM_COMM_IF_TABLE_SIZE];//当前一共定义了8个comm操作函数

static hal_virtual_comm_table_t

comm_channels[CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS+1];

static int

set_console_comm(int __comm_id)//用来设置comm口,每个comm口都对应8个该comm口操作函数[luther.gliethttp]

{

...

++__comm_id;//这样保证用户定义的__comm_id=0,实际是对应1索引.

__selected_id = __comm_id;

CYGACC_CALL_IF_CONSOLE_PROCS_SET(comm_channels[__comm_id]);//将comm_channels[__comm_id]对应的hal_virtual_comm_table_t单元

//作为默认的CONSOLE_PROC回调函数,放入hal_virtual_vector_table[CYGNUM_CALL_IF_CONSOLE_PROCS]=comm_channels[ __comm_id];

//使用CYGACC_CALL_IF_CONSOLE_PROCS()可以返回hal_virtual_comm_table_t* comm;该comm存储空间地址.

...

}

CYGNUM_CALL_IF_SET_COMM_ID_MANGLER对应comm_channels[0];也是gdb使用的comm

static void

cyg_hal_plf_serial_init(void)

{

hal_virtual_comm_table_t* comm;

int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM _ID_QUERY_CURRENT);

// Init channels

// TODO shouldn't this be default value, not 0?

cyg_hal_plf_serial_init_channel(&ep9312_ser_channels[0]);

// Setup procs in the vector table

// Set channel 0

CYGACC_CALL_IF_SET_CONSOLE_COMM(0);

comm = CYGACC_CALL_IF_CONSOLE_PROCS();//获取comm_channels[0+1]对应的comm存储空间地址

CYGACC_COMM_IF_CH_DATA_SET(*comm,&ep9312_ser_channels[0]);//填充该comm的CYGNUM_COMM_IF_CH_DATA数据

CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_serial_write);//填充该comm的CYGNUM_COMM_IF_WRITE写函数地址

CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_serial_read);

CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_serial_putc);

CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_serial_getc);

CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_serial_control);

CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_serial_isr);

CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_serial_getc_ti meout);

// Restore original console

CYGACC_CALL_IF_SET_CONSOLE_COMM(cur);

}

cyg_start

==>packages/redboot/v2_0/src/main.c|202| CYGACC_CALL_IF_SET_CONSOLE_C OMM(CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL);

至于CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL这个默认值是由cdl配置的: packages/hal/arm/arm9/ep93xx/v2_0/cdl/hal_arm_arm9_ep93xx.cdl|273| cd l_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL {

display "Debug serial port"

active_if

CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE

flavor data

legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0

//默认为0,这就表示CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANN EL);

//就是CYGACC_CALL_IF_SET_CONSOLE_COMM(0);

description "

The ep93xx board has three serial ports. This option

chooses which port will be used to connect to a host

running GDB."

}

packages/hal/arm/arch/v2_0/src/vectors.S|430| bl hal_hardware_init packages/hal/arm/arm9/var/v2_0/src/arm9_misc.c|74| hal_if_init(); packages/hal/common/v2_0/src/hal_if.c|663| externC void cyg_hal_plf_c omms_init(void);

packages/hal/common/v2_0/src/hal_if.c|925| cyg_hal_plf_comms_init(); ackages/hal/arm/arm9/ep93xx/v2_0/src/hal_diag.c|374| cyg_hal_plf_comm s_init(void)

flash_init

==>flash_hwr_init

==>code_len =(unsigned long)&flash_query_end -(unsigned long)&flash _query;

==>packages/devs/flash/intel/strata/v2_0/cdl/flash_strata.cdl|113| ec ho " .globl flash_query_end">>flash_query.s

packages/devs/flash/intel/strata/v2_0/cdl/flash_strata.cdl|114| ec ho "flash_query_end:">>flash_query.s

luther@gliethttp:/vobs/tmp/ep9312$ vim ./devs/flash/intel/strata/v2_0 /flash_query.s

.file"flash_query.c"

.text

.align 2

.global flash_query

.type flash_query,function //flash_query这个global的类型为function函数

flash_query:

@ args = 0, pretend = 0, frame = 0

@ frame_needed = 0, uses_anonymous_args = 0

str lr,[sp,#-4]!

mov ip, r0

mrc p15,0,r3,c1,c0,0;

mov r3, r3, lsr #2

ands lr, r3,#1

beq .L3

mov r2,#0;1: mov r3,#0;2: orr r0,r2,r3;mcr p15,0,r0,c7,c14,2;add r3,r3,#32;cmp r3,#256;bne 2b;add r2,r2,#0x04000000;cmp r2,#0;bne 1b;mcr p15,0,r0,c7,c10,4;

mrc p15,0,r1,c1,c0,0;bic r1,r1,#0x000C;mcr p15,0,r1,c1,c0,0;mov r1,#0;mcr p15,0,r1,c7,c6,0

.L3:

mov r3,#9961472

五大操作系统比较

五大操作系统比较.txt第一次笑是因为遇见你,第一次哭是因为你不在,第一次笑着流泪是因为不能拥有你。智能手机是一种在手机内安装了相应开放式操作系统的手机,有别普通PDA 手机手机,操作系统一般也只应用在高端智能化手机上,这些操作系统之间的应用软件互不兼容。因为可以安装第三方软件,所以智能手机有非常丰富的功能。 目前应用在手机上的操作系统主要有PalmOS、Symbian、WindowsCE、Linux和Android、iPhoneOS六种,其中采用Symbian、WindowsCE和Android的手机较多,Linux和Palm对应的软件非常少见。在国内,安装有Symbian操作系统的手机多为诺基亚生产,酷派、多普达则是WindowsMobile的主要支持者,代表产品有酷派N900+(WindowsCE6.0操作系统)、酷派F800(WindowsCE6.0操作系统)、等。 Symbian Symbian是一个实时性、多任务的纯32位操作系统,具有功耗低、内存占用少等特点,非常适合手机等移动设备使用,经过不断完善,可以支持GPRS、蓝牙、SyncML、以及3G技术。最重要的是它是一个标准化的开放式平台,任何人都可以为支持Symbian的设备开发软件。与微软产品不同的是,Symbian将移动设备的通用技术,也就是操作系统的内核,与图形用户界面技术分开,能很好的适应不同方式输入的平台,也可以使厂商可以为自己的产品制作更加友好的操作界面,符合个性化的潮流,这也是用户能见到不同样子的Symbian系统的主要原因。现在为这个平台开发的java程序已经开始在互联网上盛行。用户可以通过安装这些软件,扩展手机功能。 在Symbian发展阶段,出现了三个分支:分别是Crystal、Pearl和Quarz。前两个主要针对通讯器市场,也是出现在手机上最多的,是今后智能手机操作系统的主力军。第一款基于Symabian系统的手机是2000年上市的爱立信R380手机。而真正较为成熟的同时引起人们注意的则是2001年上市的诺基亚9210,它采用了Crystal分支的系统。而2002年推出的诺基亚7650与3650则是SymbianPearl分系的机型,其中7650是第一款基于2.5G网的智能手机产品,他们都属于Symbian的6.0版本。索尼爱立信推出的一款机型也使用了Symbian的Pearl分支,版本已经发展到7.0,是专为3G网络而开发的,而目前的诺基亚已经达到8.0的6630、6681等,可以说代表了当今最强大的手机操作系统。此外,Symbian从6.0版本就开始支持外接存储设备,如MMC卡,这让它强大的扩展能力得以充分发挥,使存放更多的软件以及各种大容量的多媒体文件成为了可能。 Windows Mobile系统 WindowsMobile系统包括PocketPC和Smartphone以及MediaCenters,PocketPC针对无线PDA,Smartphone专为手机,已有多个来自IT业的新手机厂商使用,增长率较快。 按照微软官方的说法:“WindowsMobile将熟悉的Windows体验扩展到了移动环境中,所以您可以立即使用它投入工作。” 事实上,WindowsMobile是微软进军移动设备领域的重大品牌调整,它包括PocketPC、Smartphone以及MediaCenters三大平台体系,面向个人移动电子消费市场。由于大多数机

汽车启动系统的常见电路故障分析

启动系统典型故障 启动系统的典型机械故障诊断排除 一、启动机空转 1故障现象与故障原因 接通启动开关后,只有启动机快速旋转而发动机曲轴不转。这种症状表明起动机电路畅通,故障在于启动机的传动装置和飞轮齿圈等处。 2 ?故障诊断方法 (1)若在启动机空转的同时伴有齿轮的撞击声,则表明飞轮齿圈牙齿或启动机小齿轮牙齿磨损严重或已损坏,致使不能正确地啮合。 (2)启动机传动装置故障有:单向啮合器弹簧损坏;单向啮合器滚子磨损严 重;单向啮合器套管的花键槽锈蚀,这些故障会阻碍小齿轮的正常移动,造成不 能与飞轮齿圈准确啮合等。 (3)有的启动机传动装置采用一级行星齿轮减速装置,其结构紧凑,传动比 大,效率高。但使用中常会出现载荷过大而烧毁卡死。有的采用摩擦片式离合器,若压紧弹簧损坏,花键锈蚀卡滞和摩擦离合器打滑,也会造成起动机空转。 汽车启动系主要由启动机和启动控制电路所组成,其故障有机械方面的,也有电器方面的。常见的故障现象有启动机不转,启动机运转无力,启动机空转而发动机不能启动,发动机启动后启动机运转不停,驱动齿轮与飞轮齿圈不能啮合且有异响等,下面就此逐一分析一下。 故障现象:打启动机时,有时能运转将发动机启动、有时不运转不能将发动机启动。 故障检修: 故障现象是打启动机时,有时启动机转动能将发动机启动;有时则不转动。在启动机不转动时,其电磁开关有吸动的“嗒、嗒”声。 检修时,首先检查蓄电池,确认其电量充足。然后把启动机从发动机上拆下来,解体检查。检查中发现它的四只电刷过度磨损,整流子表面有明显的烧痕。由于电刷和整流子接触不良,造成了启动机时转时不转的故障。用车床把整流子表面修复,再更换四只新的电刷,将启动机修复后装车试验。此时打启动机,启动机正常驱动发动机,发动机也顺利着车。故障完全排除。 二、启动机不转 1.在启动机不能正常转动时,表现为动力下降。 检修时,首先检查蓄电池,确认其电量充足。然后把启动机从发动机上拆下来,在拆卸过程中发现启动机的前滑动轴承已从发动机后瓢上的轴承孔中脱出。 启动机转子因前轴承损坏失去支撑,造成了转子扫膛动力下降,所以有时无力驱动

四种实时操作系统特性进行分析和比较

四种实时操作系统特性进行分析和比较 https://www.wendangku.net/doc/6e8347156.html,2006年11月18日21:55ChinaByte 本文对四种实时操作系统(RTOS)特性进行分析和比较。它们是:Lynx实时系统公司的LynxOS、QNX软件系统有限公司的QNX以及两种具有代表性的实时Linux——新墨西哥工学院的RT-Linux和堪萨斯大学的KURT-Linux。 近年来,实时操作系统在多媒体通信、在线事务处理、生产过程控制、交通控制等各个领域得到广泛的应用,因而越来越引起人们的重视。 基本特征概述 *QNX是一个分布式、嵌入式、可规模扩展的实时操作系统。它遵循POSIX.1 (程序接口)和POSIX.2(Shell和工具)、部分遵循POSIX.1b(实时扩展)。它最早开发于1980年,到现在已相当成熟。 *LynxOS是一个分布式、嵌入式、可规模扩展的实时 操作系统,它遵循POSIX.1a、POSIX.1b和POSIX.1c标准。它最早开发于1988年。 *RT-Linux是一个嵌入式硬实时操作系统,它部分支持POSIX.1b标准。 *KURT-Linux不是为嵌入式应用设计的,不同于硬(hard)实时/软(soft)实时应用,他们提出“严格(firm)”实时应用的概念,如一些多媒体应用和ATM网络应用,KURT是为这样一些应用设计的“严格的”实时系统。 体系结构异同 实时系统的实现多为微内核体系结构,这使得核心小巧而可靠,易于ROM固化,并可模块化扩展。微内核结构系统中,OS服务模块在独立的地址空间运行,所以,不同模块的内存错误便被隔离开来。但它也有弱点,进程间通信和上下文切换的开销大大增加。相对于大型集成化内核系统来说,它必须靠更多地进行系统调用来完成相同的任务。 *QNX是一个微内核实时操作系统,其核心仅提供4种服务:进程调度、进程间通信、底层网络通信和中断处理,其进程在独立的地址空间运行。所有其它OS服务,都实现为协作的用户进程,因此QNX核心非常小巧(QNX4.x大约为12Kb)而且运行速度极快。 *LynxOS目前还不是一个微内核结构的操作系统,但它计划使用所谓的“Galaxy”技术将其从大型集成化内核改造成微内核,这一技术将在LynxOS 3.0中引入。新的28Kb微内核提供以下服务:核心启动和停止、底层内存管理、出错处理、中断处理、多任务、底层同步和互斥支持。

项目启动会议议程

项目启动会议议程 在初次进入客户现场的时候召开项目启动会议,有助于扩大影响、理念交流、达成共识,这对于项目的顺利实施有非常积极的作用。 项目启动会议可以邀请用户方的主要领导或者分管信息化的分管领导,以及各职能部门的领导参加。主要议程有: 1、双方项目组成员认识; 2、项目计划沟通和通报; 3、用户方期望达到的项目目标; 4、项目经理介绍万户ezOFFICE系统的项目实施经验和心得,对用户方的 期望。 其中,ezOFFICE系统的项目实施经验和心得概要如下。 ezOFFICE系统的项目实施经验和心得 1、协同办公系统首先是管理问题,其次才是技术问题。ezOFFICE是作为一种管 理工具而存在的。在ezOFFICE的实施、推广过程中,我们要多加管理。另外,不能完全依赖技术去实现需求,用技术完全替代管理的想法是片面的、不现实的。 2、目前大部分协同办公系统采用B/S结构,相比其他的历史时期和其他大型软 件系统来说,协同办公系统的使用在国内处在一个最成熟的时期,B/S结构承袭了普通用户的上网习惯,我们有用好它的技术基础。 3、推广协同办公系统,是一把手工程,需要领导的重视与推进。关键领导的支 持:一方面领导干预或授权,推动项目按计划实施,而非不重视、任其发展甚至停滞不前;另一方面,推广系统,使系统能用起来,发挥效益最大化。 这个过程也是促进客户的执行力的过程,保障了项目的成功实施。(为什么说是一把手工程?因为协同办公系统是管理类软件,是对传统办公模式的变革,而能影响整个团队的办公模式的,只有一把手了。一把手不须事必躬亲,只是做三件事:挑得力助手;责令助手去全权实施、规划、推广协同办公系统;

项目启动计划书格式流程

项目启动计划书

一、公司简介 1.1公司基本信息 公司名称大同市天涯拓展有限责任公司 项目名称天涯素质拓展训练培训机构 项目创始人王磊 地址亲水湾 企业性质有限责任公司 注册日期 注册资本100万元人民币 公司网址 天涯拓展有限公司成立于2017年3月13日,作为一家素质拓展公司,就是要把大同市中、小学,各大小教育机构中3到16岁之间的青少年素质拓展项目进行整合,通过营销策划,为相关培训机构提供素质拓展、课外活动的服务;从而把大中小型课外培训机构、企事业单位、民间团体商家结合起来,推动素质拓展活动的联盟,达到资源整合、互惠互利的目的。 1.2公司使命 打造大同市素质拓展活动联盟第一品牌 1.3公司服务范畴 涵盖了幼小衔接亲子营、3到16岁青少年课外素质拓展、企事业单位团体

员工管理培训等多个方面。 二、项目综述 2.1项目简介 素质拓展训练是一种以提高心理素质为主要目的,兼具体能和实践的综合素质教育,它以运动为依托,以培训为方式,以感悟为目的。它与传统的知识培训和技能培训相比,少了一些说教和灌输,多了一些运动中的体验和感悟。拓展训练能使青少年学生激发个人潜能,培养乐观的心态和坚强的意志,提高沟通交流的主动性和技巧性,树立相互配合、相互支持的团队精神,极大增强合作意识,从而达到提高学生心理素质的目的。因此,这种培训方式成为学生学习生活经验、体验社会教育、形成正确的人际、情感和社会性价值观等教育目标的一个重要途径,是青少年学生素质教育中不可缺少的一项。本项目就是要把素质拓展作为一项服务,为社会团体,特别是广大青少年提供一个专业、安全、有价值的培训平台。 2.2项目精髓 实现广大青少年及各大小培训机构素质拓展方面专业性的指导,联合大同市教育商圈,做专业级平台,帮助大同市教育联盟打造一套完整的户外素质拓展活动流程。 2.3关键概念释义 大同市教育培训联盟,是一种创新的商业运营模式,整合同一商圈、同一行业、不同商家资源,为形成必要的规模效应、商业信息网络、增强商家的经济活力及收益,通过联盟的方式组成的利益共同体。项目以整合互动营销为核心,通过资源整合、资源共享,实现多方共赢。 做专业级平台,是本项目的核心概念,以素质拓展活动为开端,不断吸收经验,在稳步发展中吸纳一些教育资源,达到联合其他学校、其他机构,一起做活动的目的。在活动规模、活动专业度来说,做到行业最高标准。 吸引更多的机构一起参与、一起合作,达到资源共享,利益最大化。 2.4具体做法

项目启动会议议程完整版

项目启动会议议程 HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】

召开项目(实施阶段)启动会议的规定 为了更好地落实、检查项目实施准备工作,每个项目开始实施(施工)前,必须召开启动会议,进行并完成相关议程、签署相关文件后,该项目方能正式进入实施阶段(状态)。 在召开启动会议之前,项目经理应会同项目组成员编写及编制完成《项目管理手册》、《项目实施成本清单》、《项目实施进度计划》、《项目里程碑》、《项目采购计划》等文件,并经技术部(詹锋)、市场部(凌霜)、财务部(秦慧)审核、修改后才能在启动会议上发布。 项目(实施阶段)启动会议详细规定如下: 一、会议组织及主持:项目经理; 二、与会人员: 出席人员:项目组成员、技术部(该项目售前工程师及詹锋)、市场部 (该项目业务经理及凌霜)、财务部(财务人员--雷法清、商务人员及秦 慧); 列席人员:监督人员(市场部—卢建民、技术部—黄海)。 三、会议召开时间:项目开始实施前1-3日内; 四、用时:1~3个小时 五、准备资料:《项目管理手册》项目组成员人手一份;《项目实施成本清 单》之“施工实施费用部分”、《项目实施进度计划》、《项目里程 碑》、《项目采购计划》各一份;《施工方案》(安装工艺、规范标准、 实施指南、作业指导等)初稿一份;《分包协议》初稿一份。 六、会议议程: 1.与会人员签到(记录表保存在内部的《工程文档》中); 2.各部门审阅有关文件; 3.项目经理介绍项目情况; 4.项目经理介绍项目组成员(包括市场部/财务部相关人员)及分工; 5.项目经理讲解《项目管理手册》要点、难点、重点; 6.项目经理介绍项目进度计划、项目里程碑、采购计划、分包协议; 7.财务部、市场部提出意见、建议和注意事项;

中国中铁项目启动会议程及讲稿草案090117

中国中铁股份有限公司 人力资源信息化管理系统项目实施启动会 根据中国中铁人力资源部信息化规划整体部署和安排,报经总经理会及相关业务部门审议并通过,与用友公司结成战略合作伙伴关系,在系统内实施并推广用友e-HR人力资源管理软件。此项工作已于08年底正式启动,为了保证项目的顺利实施和在各单位的成功推广,经双方项目组讨论并报中国中铁相关领导通过,于近期将召开“中国中铁人力资源信息化管理系统建设项目启动会”。 下面将启动会安排汇报如下: 一、启动会议程概述 启动会名称: “中国中铁人力资源信息化管理系统项目实施启动会” 启动会时间:2009年1月XX日上午9:30 启动会地点:中国中铁大厦B座302视频会议室 启动会形式:视频直播 与会人员:中国中铁相关领导及项目组主要成员等5-10人 用友公司领导和项目组主要成员等5-10人主持人:成军总或许部长

二、启动会主要议程。 9:00-9:30 会议前准备(视频设备调试准备,资料发放) 9:30-9:40 主持人宣布会议开始,并宣读会议议程 9:40-10:10 中国中铁马立总讲话 10:10-10:25 用友公司吴晓冬副总裁讲话 10:25-10:45 中铁项目组组长(XXX)宣布项目启动工作布臵10:45-11:00 用友项目经理讲解项目实施计划及实施方法 11:00-11:30 中国中铁刘辉总讲话(信息化) 11:30-11:35 主持人宣布启动会结束 三、参会人员清单 为加大建设人力资源信息化的力度,使之更深入人心,并积极扩大总公司开展信息化建设的影响,拟请相关人员出席:总公司:刘辉总、许成军总 人力资源部:许廷旺部长、赵超英副部长。。。 科技部:高峰部长、王烨、黄丛治。。。 下属单位参加人员:(出席视频会议)

ecos文件系统

eCos学习笔记之文件系统架构 2006-08-01 12:16 文件系统架构: 文件系统表是一个描述每个文件系统入口的数组,每一个驻留的文件系统应该输出一个表项使用FSTAB_ENTRY()宏。 struct cyg_fstab_entry //packages/io/fileio/v2_0/include/fileio.h,文件系统表项 { const char *name; // filesystem name CYG_ADDRWORD data; // private data value cyg_uint32 syncmode; // synchronization mode//文件系统锁协议 int (*mount) ( cyg_fstab_entry *fste, cyg_mtab_entry *mte ); int (*umount) ( cyg_mtab_entry *mte ); int (*open) ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, int mode, cyg_file *fte ); int (*unlink) ( cyg_mtab_entry *mte, cyg_dir dir, const char *name ); int (*mkdir) ( cyg_mtab_entry *mte, cyg_dir dir, const char *name ); int (*rmdir) ( cyg_mtab_entry *mte, cyg_dir dir, const char *name ); int (*rename) ( cyg_mtab_entry *mte, cyg_dir dir1, const char *name1, cyg_dir dir2, const char *name2 ); int (*link) ( cyg_mtab_entry *mte, cyg_dir dir1, const char *name1, cyg_dir dir2, const char *name2, int type ); int (*opendir) ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, cyg_file *fte ); //读方式打开一个目录 int (*chdir) ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, cyg_dir *dir_out ); int (*stat) ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, struct stat *buf); int (*getinfo) ( cyg_mtab_entry *mte, cyg_dir dir, const char *name, int key, char *buf, int len ); int (*setinfo) ( cyg_mtab_entry *mte, cyg_dir dir, const char *name,

项目启动会流程

一、开项目启动会前,需要准备以下事宜。 1、与项目发起人(销售或公司高层领导,外部项目一般是销售,内部项目一般是公司高层)沟通了解项目整体情况:市场份额、项目情况、分工界面、发起方负责部门和负责人员、关键里程碑等。 2、跟领导确认项目团队框架,开发人员、测试人员、售前、产品、交付、采购等。确认项目预算。 3、跟项目负责人简单沟通项目情况,了解他们目前的工作分配,对此项目的了解和可以参加项目启动会时间 4、找一个最近的且关键团队人员能够参加的时间作为项目启动会召开时间,提前与他们沟通确认时间是否可以,并至少提前两天发邮件通知大家,开会时间、地点和项目议题等。 二、项目启动会一般流程: 1、领导开场,说明项目远景,并指定项目经理及内部关键干系人(售前负责人、研发经理、采购负责人、售前等,一般会前已经沟通好的)。 2、发起人(销售或公司高层领导),说明项目成立背景和成功标准,里程碑规划,项目主要干系人 3、售前,简单介绍项目情况,技术架构,周边项目及厂商 4、研发经理,介绍开发人员配置及入场时间,及相应开发周期 5、测试经理,说明测试人员配置及入场时间 6、采购,说明下项目需采购设备周期 7、交付,说明下实施周期及实施方案讨论

8、项目经理,会议中主持会议,防止会议跑题、时间控制、记录会议要点等,会议后梳理会议结论并给会议参与人员和项目人员群发会议纪要。 项目启动会主要是信息共享,而非问题讨论,最好会前与各方沟通清楚各方的工作职责和事项。项目启动会控制在一个小时为佳,超过2个小时仍在争论,没能达成明确清晰的分工,就算是失败的项目启动会。 三、项目启动会会议纪要要点 参与人员、地点、时间 合同类型、市场份额、涉及省市、周边厂商 公司内部项目相关负责人,各负责人职责;局方相关的联系人公司内部项目流程 关键里程碑(到货、开发、测试等关键时间点) 项目所需注意事项

ios操作系统与安卓系统对比的优势教学文稿

i o s操作系统与安卓 系统对比的优势

ios操作系统与安卓系统对比的优势 Android抗衡iOS还是有些力不从心,比如在移动应用开发者的收入方面,平台的整合度,操作的流畅度等。尤其在企业级市场,几乎已被iOS全面占领,新兴的企业都表示更加青睐iOS而非所谓“开放”、基于Linux内核、拥有双核甚至四核……的Android设备。 企业级用户对稳定和实时性的需求恰恰就是Android的软肋,网络上一个段子很能表现Android的窘境:“Android用户三大爱好:刷机重启换电池”,还有人出来解释“为什么Android永远不会比iOS流畅”,并称Android是本着学、赶、超的思路诞生并发展起来,在黑莓时代Android设备最早是按照全键盘机型作为参考,后来iPhone的横空出世才导致Android瞬间改头换面,于是为后面的图形渲染等等埋下了隐患。 Android是第一个内置支持Java的操作系统,Android应用程序使用Java语言编写。Android开发水平的高低很大程度上取决于Java语言核心能力是否扎实。iOS苹果的iPhone和iPad应用开发都指定使用同一开发语言:Objective-C 语言。Objective-C是Cocoa的本地编程语言,Coaco框架和大多数应用程序都使用该语言编写而成。但是也可以使用Python、Ruby等其他编程语言开发应用程序,并且此种开发方式也可使用Cocoa框架。 系统特性: 1、与硬件整合度高:使用起来更加流畅;不支持Flash,但可以使用第三方程式Jailbreak观看。 2、通知中心:苹果在iOS5上改变了通知中心的形式。在新的通知中心中,提示不会再像以前那样弹出,而是像Android系统那样出现在屏幕上方。你可以下拉这个菜单,选择自己想查看的信息。不会再被弹出的信息打扰还是件很令人舒服的改变。

eCos接口文档

These files document the internal implementation of eCos which may or may not change in later revisions. The interface presented here has no guarantee of being supported in future releases of eCos. Copyright (c) 2002 by Navosha Inc.. This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.0 or later (the latest version is presently available at https://www.wendangku.net/doc/6e8347156.html,/openpub/). Distribution of the work or derivative of the work in any standard (paper) book form is prohibited unless prior permission is obtained from the copyright holder. The holder my be contacted at staff@https://www.wendangku.net/doc/6e8347156.html,. This document may be reproduced in all or part electronically as well as modified provided that the Navosha logo is incorporated in the resulting document and all copyright notices are included. NOTE: this is an ALPHA document currently. There may be errors as well as omissions in this document. Your feedback is welcome and appreciated. Table of Contents Cyg_Alarm Alarms Cyg_Binary_Semaphore Binary Semaphores Cyg_Clock Clocks Cyg_Condition_Variable Conditional Variables Cyg_Counter Counters Cyg_Counting_Semaphore Counting Semaphores Cyg_Flag Flags Cyg_Interrupt Interrupts Cyg_Mbox Mailboxes Cyg_Mempool_Fixed Fixed Sized Memory Allocation Cyg_Mempool_Variable Variable Sized Memory Allocation Cyg_Mutex Mutual Exclusion

常见的操作系统及其优缺点比较

常见的操作系统及其优缺点比较 系统名称简介DOSDiskOperatingSystem又称DOS(简写),中文全名“磁盘操作系统”。 Windows发行于2001年10月25日,原来的名称是Whistler。 2011年7月初,微软表示将于2014年春季彻底取消对Windowsxp的技术支持。 UNIX是一个强大的多用户、多任务操作系统,支持多种处理器架构,按照操作系统的分类,属于分时操作系统。 Linux是一种自由和开放源码的类Unix操作系统。 可安装在各种计算机硬件设备中。 世界上运算最快的超级计算机运行的都是Linux系统。 Android是一种以Linux为基础的开放源代码操作系统,主要使用于便携设备。 优点1快捷,熟练的用户可以通过创建BAT或CMD批处理文件完成一些烦琐的任务。 2速度快,安全,价格便宜。 缺点1日常应用功能不丰富,(没有图形界面)命令行操作不直观,对设备的支持比较少2很多设备的大部分程序都不能在DOS环境下执行。 1.系统更新落后,漏洞较多,不稳定,易受病毒和木马的攻击; 2.自带软件版本较低,需要自行卸载升级; 3.所有软件和程序预装在C盘,加重系统负担,即使卸载,仍有残余大量垃圾碎片文件,容易拖慢系统。

1UNIX系统的标准1/O库相对其底层的系统调用接口已变得越来越复杂了。 2传统的UNIX内核不够灵活,不具备很好的可扩充性,也很少代码复用的设施。 android1图形界面良好,拥有良好的集成开发环境,操作简单。 提供了一个可伸缩的高性能平台。 2整合常见应用软件,简单,快捷,方便。 适合电脑城销售人员及维修商快速装机。 1由于附带源代码,用户可以分析它,更改它。 文件系统小巧,简单。 2将所有的设备用文件表示,可使用与处理文件相同的命令和系统调用集访问设备。 3具有可移植性。 1安全、易维护、稳定。 1缺失的应用软件和游戏-您会失2软件自由/开源去一些熟知的应用程序。 3低成本-大多数2缺少硬件支持-绝大多数硬件是4透明公开-绝大多数支持的,但不是全部GNU/Linux是开放开发的。 3寻求帮助更难-通常朋友、家人、同事不能帮您解决GNU/Linux相关问题,所以您需要在线获取帮助。 开放性强、挣脱运营商的束1个人隐私难得到保守。 缚,具有丰富的硬件选择2系统自带广告太多。 3过分依赖开发商缺少标准配置。

(原创)eCos驱动分析 之 ISR是如何与硬件中断联系起来的 ---转载文章

(原创)eCos驱动分析之ISR是如何与硬件中断联系起来的 ---转载文章 要想知道ecos的中断ISR是怎么与硬件中断向量联系起来的,是怎么被调用的?那就要看下面这两个关键的函数:cyg_drv_interrupt_create()cyg_drv_interrupt_attach() 这两个函数都声明在cyg/kernel/kapi.h中,其形式如下: void cyg_interrupt_create( cyg_vector_t vector, /* Vector to attach to */ cyg_priority_t priority, /* Queue priority */ cyg_addrword_t data, /* Data pointer */ cyg_ISR_t *isr, /* Interrupt Service Routine */ cyg_DSR_t *dsr, /* Deferred Service Routine */ cyg_handle_t *handle, /* returned handle */ cyg_interrupt *intr /* put interrupt here */) __THROW; void cyg_interrupt_attach( cyg_handle_t interrupt ) __THROW; (注: __THROW是在C++中用的,是用来抛出异常的,详见我的博文 https://www.wendangku.net/doc/6e8347156.html,/blog/static/8888074320116

11193510/ 这里可以视而不见.)其中文意义对照如下:cyg_interrupt_create( 中断号, 中断优先级, 传递的中断参数, ISR函数, DSR函数, 被返回的中断句柄, 存放与此中断相关的内核数据的变量空间);cyg_interrupt_attach(中断句柄);这样实际上去研究一下cyg_interrupt_create函数的定义内容,应该就能搞明白我们的问题了!由于其函数声明在kapi.h中,很自然的就想到其定义应在kapi.c文件中,找到....\ecos\ecos-current\packages\kernel\current\src\comm on\kapi.cxx文件,找到这两个函数的定义如下: /*---------------------------------------------------------------------------*//* Interrupt handling */ externC void cyg_interrupt_create( cyg_vector_t vector, /* Vector to attach to */ cyg_priority_t priority, /* Queue priority */ cyg_addrword_t data, /* Data pointer */ cyg_ISR_t *isr, /* Interrupt Service Routine */ cyg_DSR_t *dsr, /* Deferred Service Routine */ cyg_handle_t *handle, /* returned handle */

启动系统的故障分析与诊断

江苏省无锡交通高等职业技术学校毕业论文 启动系统的故障分析与诊断 姓名严江伟 学级121513 系别汽车工程系 专业汽车检测与维修 指导教师江玉婷 提交时间2015 年01 月 05 日

目录 摘要 (01) 关键词 (01) 一、启动系统的简介 (02) 1.1起动机的启动类型 (02) 1.2启动机的组成 (02) 1.3直流电机的组成 (02) 1.4传动机构 (03) 1.5电磁快关 (04) 二、启动系统的使用和护 (05) 三、启动机的典型故障 (05) 3,1起动机空转 (05) 3.2启动机不转 (06) 3.3启动机运转无力 (07) 3.4启动机有异响 (08) 四、启动系统电路的典故障分析与排除实例 (09) 4.1、启动系统典型电路工作原理 (09) 4.2、启动系统电路的典型故障诊断分析与排除 (10) 五、动系统电路的发展未来 (10) 六、小结 (11) 七、参考文献 (12) 八、致谢 (13)

启动系统的故障分析与诊断 姓名:严江伟 班级:121513 指导老师:江玉婷 摘要 静止的发动机进入工作状态,必须先用外力转动发动机曲轴,使活塞开始上下运动,气缸内吸入可燃混合气,并将其压缩、点燃,体积迅速膨胀产生强大的动力,推动活塞运动并带动曲轴旋转,发动机才能自动地进入工作循环。发动机的曲轴在外力作用下开始转动到发动机自动怠速运转的全过程,称为发动机的起动过程。完成起动所需要的装置叫起动系。通过发动机起动机的电路故障的检测和诊断的讲述。让我们知道启动系统的组成和其功用。并对启动系统的常见故障现象、故障部位、故障机理、故障的检测、诊断和排除有了一定的认识。明确了检测和诊断的基本思路。通过理论与实践结合,把启动系统常见的故障检测与诊断作了说明。 关键词:启动机启动系的维护启动电路启动系统的典型故障

eCos内核概览

eCos内核概览 eCos内核概览(1)实时内核 eCos的核心是一个功能全面的,灵活的,可配置的实时内核。这个内核提供了多线程支持,多种调度器的选择,一组丰富的同步原语,内存分配原语和线程管理函数。 在这个内核中,可以改变或替换其中的某些部分(比如调度器)而不会影响内核本身的别的模块。 下列是这个内核的一些特征: 可以选择内存分配算法 可以选择调度算法 一组丰富的同步原语 定时器,计数器和alarms 中断处理 exception处理 cache控制 线程支持 内核支持用GDB进行多线程调试 trace buffers infrastructure and instrumentation eCos内核概览(2)调度器 调度器是内核的核心。它定义了线程运行的方式,提供了线程同步的机制。它也控制中断是如何影响线程执行的。没有一个调度器可以覆盖所有可能的系统配置。我们需要几种调度策略来满足不同的需要。这里提供了三种调度器。 位图调度器 位图中每一位表示一个可运行的线程,而每个线程有一个独一无二的优先级,系统允许的线程数是有上限的。 多级队列调度器 可以在相同优先级线程之间按时间片轮换,支持优先级继承。 lottery调度器 目前在任何时候系统只支持一种调度器。将来系统会允许多种调度器共存,但是这将会隐藏在现有的调度器API后。 为了能够安全调度,我们需要一种在并发访问中保护调度器数据结构的机制,传统的方法

是在这个临界区禁止中断。不幸的是,这增加了中断的最大dispatch延迟,在任何实时系统中都应当避免这种情形的发生。 eCos采用的机制是保持一个计数器,Scheduler::sched_lock。如果它的值不为0,就防止了重新调度。当前的中断通过调用Scheduler::lock()得到这个锁,它对这个计数器加1避免进一步的调度。函数Scheduler::unlock()对这个计数器减1,如果它返回0,允许继续调度。 为了在中断存在的情况下这种机制能够很好地工作,需要ISR推迟执行任何引起调度(scheduler-oriented)的操作,直到这个锁将要为0。为此我们把ISR的工作分割成两部分。并把第二部分,DSR,写进队列,直到调度器认为运行它们是安全的。(细节见第三章的中断和exception handler) 在单处理器上,Scheduler::lock()仅仅是对Scheduler::sched_lock加1。既然这个锁严格地被嵌套,Scheduler::lock()不需要一个读-修改-写周期。当前线程正在运行这个事实意味着这个锁还没有被别的线程获得,因此它总是可获得的。 eCos内核概览(3)线程同步 为了允许线程协调和竟争资源,提供同步和通讯机制是必要的。传统的同步机制是互斥/条件变量和信号量。eCos内核不但支持这些机制,它还提供了在实时系统中普遍用到的其它同步和通讯机制,例如event flags和消息队列。 在任何实时系统中必须处理的一个问题是优先级倒转(priority inversion)问题。它出现在一个高优先级线程(错误地)被一个低优先级线程阻止了继续执行。一般的例子是:一个高优先级线程等待一个互斥量,而这个互斥量正被一个低优先级线程所拥有,如果这个低优先级线程被一个中等优先级的线程剥夺了运行,那么就发生了优先级倒转,既然这个高优先级线程被一个不相关的较低优先级线程阻止了继续执行。 这里有好几种方法可以解决这个问题。最简单的是运用一个优先级ceiling protocal。所有获得这个互斥量的线程把它们的优先级提升到一个事先规定好的值。它有如下不利因素:它需要事先知道使用这个互斥量线程的最高优先级;如果这个事先规定的值太高,它相当于一个全局锁禁止了所有的调度。 一个更好的解决方案是使用优先级继承协议,拥有互斥量的线程的优先级被提升到与正在等待这个互斥量的最高优先级线程的优先级相等。这个技术不需要预先知道准备使用这个互斥量线程们的优先级。当一个更高优先级线程处于等待时,只有拥有互斥量的线程的优先级被提升。这种方法减少了对别的线程进行调度的影响。但是它的不利之处在于:每次同步调用的开销增加了,因为每次都得遵守这个继承协议。

实时操作系统包括硬实时和软实时的区别

一.什么是真正的实时操作系统 做嵌入式系统开发有一段时间了,做过用于手机平台的嵌入式Linux,也接触过用于交换机、媒体网关平台的VxWorks,实际应用后回过头来看理论,才发现自己理解的肤浅,也发现CSDN 上好多同学们都对实时、嵌入式这些概念似懂非懂,毕竟如果不做类似的产品,平时接触的机会很少,即使做嵌入式产品开发,基本也是只管调用Platformteam封装好的API。所以在此总结一下这些概念,加深自己的理解,同时也给新手入门,欢迎大家拍砖,争取写个连载,本文先总结一下实时的概念,什么是真正的实时操作系统? 1. 首先说一下实时的定义及要求: 参见 Donal Gillies 在 Realtime Computing FAQ 中提出定义:实时系统指系统的计算正确性不仅取决于计算的逻辑正确性,还取决于产生结果的时间。如果未满足系统的时间约束,则认为系统失效。

一个实时操作系统面对变化的负载(从最小到最坏的情况)时必须确定性地保证满足时间要求。请注意,必须要满足确定性,而不是要求速度足够快!例如,如果使用足够强大的CPU,Windows在CPU空闲时可以提供非常短的典型中断响应,但是,当某些后台任务正在运行时,有时候响应会变得非常漫长,以至于某一个简单的读取文件的任务会长时间无响应,甚至直接挂死。这是一个基本的问题:并不是Windows不够快或效率不够高,而是因为它不能提供确定性,所以,Windows不是一个实时操作系统。 根据实际应用,可以选择采用硬实时操作系统或软实时操作系统,硬实时当然比软实时好,但是,如果你的公司正在准备开发一款商用软件,那请你注意了,业界公认比较好的VxWorks(WindRiver开发),会花光你本来就很少的银子,而软实时的操作系统,如某些实时Linux,一般是开源免费的,我们公司本来的产品就是基于VxWorks的,现在业界都在CostReduction,为了响应号召,正在调研如何把平台换成免费的嵌入式实时Linux。同学们,如何选择,自己考虑吧:-)

项目启动大会流程

项目启动大会流程 项目启动大会是一二手联动营销开始前动员大会,主要目的是集中向各销售人员展示分销项目,公布分销激励政策充分调动员工积极性快速实现销售目标,具体流程如下: 一、参与人员包括:运营部门职能部门、各加盟商及销售人员、对接人,策划人员、开发商相关人员。 二、大会内容第一项分销项目情况介绍,包括:1、市场动态分析,根据当前房地产市场动态结合分销项目进行分析,为项目分销成功提供理论依据,提升员工分销信心;2、分销项目优劣势分析,进一步挖掘项目亮点为员工提供分销说辞;3、客户分析,协助销售人员根据项目情况进行客户细分,为销售人员拓展客户提供方向性指导;4、周边竞品项目优劣势对比,再次突出本项目分销优势,提升员工信心。5、定房会当天销售政策,客户要求等。 三、大会内容第二项分销项目销售流程,包括:1、明确售楼部与外围分销团队分工,售楼部暂停销售工作,只负责接待来访客户讲解项目基本情况,外围分销团队负责拓展客户渠道,引导意向客户到售楼部看房以及后期逼单;2、外围分销团队带客户到售楼部后,由售楼部人员配合接待讲解项目,客户离开后,由外围分销团队销售人员及接待售楼员共同到项目客户管理人员处核对客户,根据客户来访电话号码进行查重工作,查重期限根据项目情况与开发商进行协商。如客户在查重期限内属无效带看,如客户没有在期限内属有效带看,由接待售楼员填写《客户来访登记表》一式两份与客户管理人员共同

签字确认后交给外围分销团队销售人员。3、客户界定只限于外围分销团队与售楼部客户进行区分,外围分销团队之间客户不区分以最终收取客户意向金为准。客户确定购买意向后由外围分销团队销售人员收取客户一定金额意向金并向客户提供收据。4、客户持意向金收据可参加分销项目开盘定房会,定房会当天交定金确定选房客户可享受相关优惠政策。5、定房会当天客户选房顺序以随机摇号为准,摇号依据是客户意向金收据号。6、定房会当天只收取客户定金确定客户选房楼号,不进行相关优惠政策解释及付款方式的确认,定房结束后七天内客户到售楼部交首期款时再进一步与客户协商付款方式及优惠。7、定房会结束后根据当天定房情况及时向各外围分销团队通报定房情况并要求及时通知客户交首期款并签订购房协议。8、客户交清首期款并签订购房协议后七日内对外围分销团队支付佣金。 四、大会内容第三项分销激励政策,包括:1、对各外围分销团队明确分销周期,确定单套销售佣金标准;2、明确递增式奖励政策,即以每销售团队登记人数为基准,制定每人多销售一套奖励标准;3、即实行奖励政策。 五、大会内容第四项主要销售团队展示公众承诺,包括:运营团队支持承诺,销售团队销售目标承诺等,将各团队承诺上墙公示。 六、分销正式启动。

linux-ecos

Linux下建立ecos开发环境 本文链接:https://www.wendangku.net/doc/6e8347156.html,/s/blog_574d08530100f5rf.html 在装好后的Linux系统(此处使用的是Fedora 10)后,开始准备建立ecos 的开发环境 1.下载安装tcl/tk工具(linux是fedora10的可以省略这一步,其他系统就不清楚了) 方法见我的博客《tcl/tk的安装》,或者google搜索相关的方法也可以 地址:https://www.wendangku.net/doc/6e8347156.html,/s/blog_574d08530100f5n4.html 2.根据ECOS网站https://www.wendangku.net/doc/6e8347156.html,/getstart.html的页面说面: Developers wishing to use the pre-built eCos host tools on a Linux host must first ensure that they have libstdc++ v3 (/usr/lib/libstdc++.so.5) installed. 先安装:libstdc++ v3 以root身份登录超级终端,输入以下命令行 yum install compat-libstdc++-33(因为我是Fedora) 3.libstdc++ v3 安装完成后,输入以下命令行 cd /opt(opt文件夹是我准备放安装ecos开发环境的文件夹) wget --passive-ftp ftp://https://www.wendangku.net/doc/6e8347156.html,/pub/ecos/ecos-install.tcl(输入 这条命令后,可能会出现wget:unable to resolve host address'https://www.wendangku.net/doc/6e8347156.html,'这样的反馈信息,这说明你的虚拟机没有 连上你要下载ecos的站点,多试几次就可以了) 成功后继续输入命令

相关文档
相关文档 最新文档