Avatar

帮同学宣传一下http://shop57644665.taobao.com/

终端管理(DM)平台是基于OMA 国际标准的移动数据增值业务,开放性与标准化是DM 业务系统赖以生存发展的基础。支持DM 业务的终端产品应同样符合这一原则,基于业界开放式标准,包括各种网络协议、内容格式,并且要体现良好的扩展性和互操作能力。

主要涉及的标准及其协议有
中国移动GPRS移动终端规范,CMPP协议,SyncML,OMA,OTA,WAP.

终端管理(DM)业务是中国移动用于管理用户终端的新业务,它使得中国移动实现了通过无线方式对移动终端进行远程管理的能力。终端管理业务一阶段应包括:终端自注册,软件补丁修复和功能升级,终端参数收集以及终端参数配置。

如终端出现软件故障或参数配置问题,用户无须前往维修中心进行诊断和软件更新,而是通过终端管理(DM)平台提供的服务进行远程终端诊断,通过无线方式下载终端软件补丁程序或执行自动远程设置即可解决终端软件故障和参数配置问题。使用终端管理业务平台,手机业务参数的设置以及新的终端软件版本的下载升级也可通过DM 平台的用户自服务门户,由用户自行完成相关参数设置和软件升级,极大的方便了用户对终端的使用。

中国移动的未来新业务部署工作,可以通过在原有终端上推送新版本的软件完成,避免了过去为了支持新业务给中国移动和用户带来的各种不便,同时也利于中国移动迅速推广新业务。使用终端管理(DM)平台,中国移动可以对终端的界面进行更新,辅助用户实现个性化终端设置。这将还有助于树立中国移动品牌形象,提升用户满意度。终端管理(DM) 平台的业务分析统计功能,通过分析终端厂商上传的终端能力信息和无线方式收集的终端其他信息,可用于中国移动的业务分析和经营决策。

终端通过终端自注册,将终端的基本信息上报到终端管理(DM)平台。终端管理(DM)平台使用OMA DM 协议对终端的参数进行配置。通过OMA DM1.1.2 协议实现了终端信息与终端管理(DM)平台的信息同步和信息发现过程,以及对终端的远程无线方式的参数收集和参数配置功能。终端管理(DM)平台使用OMA FUMO 规范,实现终端软件补丁修复和功能升级。

终端自注册成功后,移动用户可以通过多种方式使用终端管理服务。
网络侧发起,对终端进行批量参数设置、参数收集或软件除错或功能升级;
移动用户通过登录用户自服务网站,通过DM 平台触发终端管理业务;
移动用户通过手机DM WAP Portal,触发终端管理业务;
通过终端侧发起的DM 服务;(二阶段)

Tagged with: , , .
Avatar

帮同学宣传一下http://shop57644665.taobao.com/

直接通过一个例子来解释。
-c /* Autoinitialize variables at runtime */
在代码中可以使用scatter file中的符号。

以下这个MEMORY字段是这个系统的整体上划分。包括系统的flash,片外ram,片内ram,还有也表明了已经固化的ROM的地址及其长度。

MEMORY
{
/* Secure Boot ROM */
BOOT_MEM (RXI)  : org = 0×00000000   len = 0×00100000
名称(属性) 要固定的起始地址  长度。
/* CS0: External SRAM 2 Mbytes */
D_MEM0   (RW)  : org = 0×00400000   len = 0×002d0000

/* code Area */
P_MEM0   (RXI) : org = 0×06000000   len = 0×00210000
P_MEM1   (RXI) : org = 0×06210000   len = 0×001f0000
P_MEM2   (RXI) : org = 0×06400000   len = 0×00080000
P_MEM3   (RXI) : org = 0×06480000   len = 0×00180000

/* resource Area */
R_MEM      (RXI)  : org = 0×06600000   len = 0×00200000

/* FFS Area  */
FFS_MEM  (RI)  : org = 0×06800000   len = 0×00800000

S_ROM   (RXI) : org = 0×08050000   len = 0×00030000

/* Allocate memory for MIDI and JPEG */

/* CS6: Calypso+ Internal SRAM 320 kbytes */
/* Code & Variables Memory */
S_MEM    (RXW) : org = 0×08000000   len = 0×00037560 /*0×0004FB60*/
}

-heap 0×10000    /*HEAP AREA SIZE*/
Heap是留给系统实时库使用的空间。

SECTIONS字段是对MEMORY中各个段的详细描述。

SECTIONS
{
/* Entry point of the Firmware */
.start   : {} > 0×06000000
.start是使用预处理指定定义的一个标识,代码中是
.sect “.start”
这里将其地址固定在0×06000000处。

/*
*  Interrupt vector re-mapping management
*/
.intload : {} > 0×06000004
.indint  : {} load = 0×06000008, run = 0×0800000C
.indint的代码储存在flash中的地址也就是load的地址是0×06000008,但是可以通过run = 0×0800000C来实现其在ram运行,在ram中的地址是0×0800000C,链接器在link时对该处使用在ram中的地址来进行链接。

.inttext : {} > P_MEM0     /* int.s Code */

.bss_dar : > D_MEM0        /* DAR SWE Variables */
{
$(BSS_DAR_LIB)
}
名称为BSS_DAR_LIB的lib的bss,也就是全局变量放入到D_MEM0,而且他们有一个标识.bss_dar
.bss     : > D_MEM0        /* Global & Static Variables */
{
$(BSS_BOOT_LIB)
}
.bss是编译器默认的全局变量的名称。以上一段是将名称为BSS_BOOT_LIB的lib中的全局变量放入到D_MEM0中。
Read the rest of this post »

Tagged with: , .
Avatar

帮同学宣传一下http://shop57644665.taobao.com/

scatter-loading机制允许我们通过scatter file将image中的各个区域指定到特定的地址上。其实对于一个特定的系统,这个也是必须的,因为每个系统的片选地址是不一样的。

以下这个简单的例子中,flash的开始地址是0×0000,其长度为0×8000,用于存放code和各种Read-Olny数据。RAM的起始地址是0×10000,其可用大小为0×6000,用于存放Read-Write数据。

Load和Run时的情况如下

我们也可以通过类似bootarm.obj (C$$code,+First)的格式,来手动指定特定c文件中特定部分(使用预处理指令命名,例子中为C$$code)出现在该段的最前面(+First)或最后面(+Last)。
当然scatter file支持更加复杂的应用,比如多个load rom,内存共用,代码在ram中执行等等…

使用scatter file会对应生成一些与之相对应的符号(symbols)。这些符号是可以在我们的代码中进行引用的。生成的符号及其意义如下:
Load$$region_name$$Base                 Load address of the region.
Image$$region_name$$Base               Execution address of the region.
Image$$region_name$$Length            Execution region length in bytes (multiple of 4).
Image$$region_name$$Limit               Address of the byte beyond the end of the execution region.
Image$$region_name$$ZI$$Base         Execution address of the ZI output section in this region.
Image$$region_name$$ZI$$Length      Length of the ZI output section in bytes (multiple of 4).
Image$$region_name$$ZI$$Limit         Address of the byte beyond the end of the ZI output section in the execution region.
在我们的代码中使用如下例子。
IMPORT ||Image$$region_name$$ZI$$Limit||
__user_initial_stackheap
LDR r0, =||Image$$region_name$$ZI$$Limit||
MOV pc, lr

Tagged with: .
Avatar

帮同学宣传一下http://shop57644665.taobao.com/

一般一个ARM系统的boot过程是这样的。首先ARM在上电后直接跳转到0地址,在这个地址上存放的是系统的启动代码。系统开始执行时一般会先设置DPLL和clock,然后进行片选,接着将需要放到ram中代码手动copy到ram中,设置EMI等系统必要参数,设置ARM各个模式的系统堆栈,切回SVC模式进行操作系统初始化。
以下是一个实际的基于ARM平台的一个bootloader示例。
编译环境:ADSv1.2
Read the rest of this post »

Tagged with: , .
Avatar

帮同学宣传一下http://shop57644665.taobao.com/

典型的手机ic由以下几部分组成
The Digital Base Band structure
The Radio Frequency Sub-System
The RF Sub-System Wrapper

这部分主要由MCU部分,DSP部分,外设GPIO,数据总线等部分组成。

Read the rest of this post »

Tagged with: , , .
Avatar

帮同学宣传一下http://shop57644665.taobao.com/

在我的wordpress中,根据饭否提供的api,使用php写了一个读取饭否最新的一条消息。为什么不用饭否的wordpress插件呢?因为我只需要简单的读取,不需要那么复杂的应用。

代码如下

<?php
$url = 'http://api.fanfou.com/statuses/user_timeline.xml?count=1';
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_USERPWD,"ilived.cn@gmail.com:XXXXXX");
ob_start();
curl_exec($ch);
curl_close($ch);
$content = ob_get_contents();
ob_end_clean();
preg_match("#<text>(.*?)</text>#s",$content,$matches);
?>

其中$matches[0]就是最新的消息文本。

例子见右边的About Me

Tagged with: .
Avatar

帮同学宣传一下http://shop57644665.taobao.com/

在Nucleus中timer的创建函数是NU_Create_Timer,其定义是

#define         NU_Create_Timer                 TMS_Create_Timer

通过其参数我们就可以看出如何设置一个timer。

STATUS  TMS_Create_Timer(NU_TIMER *timer_ptr, CHAR *name,
VOID (*expiration_routine)(UNSIGNED), UNSIGNED id,
UNSIGNED initial_time, UNSIGNED reschedule_time, OPTION enable)

timer -> tm_actual_timer.tm_timer_type =    TM_APPL_TIMER;
CSC_Place_On_List(&TMD_Created_Timers_List, &(timer -> tm_created));
TMD_Total_Timers++;

创建一个timer是很容易看懂的,我们主要分析timer时间到了之后的系统流程。

在TI平台中使用一个硬件晶振产生中断来作为系统的定时器,每次中断间隔时间作为操作系统的一个tick,也就是一个时间片。当中断发生时也就是产生了一个irq,在以前的irq流程中分析中我们可以知道每个irq都有一个自己的处理函数。在ti的平台的这个函数中我们可以发现如下代码

TMT_Timer_Interrupt();

这个函数就是Nucleus timer的接口函数,在这个函数中会检查是否有timer的时间到了,如果有timer active需要进行对应的操作,该函数会激活timer的HISR,这个HISR是在Nucleus初始化时TMI_Initialize函数中创建的。

status =  TCCE_Create_HISR((NU_HISR *) &TMD_HISR, "SYSTEM H",
TMC_Timer_HISR, (OPTION) TMD_HISR_Priority,
TMD_HISR_Stack_Ptr, TMD_HISR_Stack_Size);

在这个HISR的处理函数中,使用timer函数创建的timer的最主要的代码是

/* Determine if the task timer has expired.  */
if (TMD_Timer_State == TM_EXPIRED)

/* Resume the timer task.  */
TMC_Timer_Expiration();

在TMC_Timer_Expiration函数中

id =                  app_timer -> tm_expiration_id;
expiration_routine =  app_timer -> tm_expiration_routine;
//app_timer的tm_expiration_id和tm_expiration_routine就是创建函数TMS_Create_Timer传入的参数。
if (!done)
{

/* Determine which type of timer has expired.  */
if (type == TM_APPL_TIMER)
//类型为TM_APPL_TIMER,也就是task调用timer函数创建的类型。
//调用创建传入的timer超时时需要调用的函数。
/* Call application timer's expiration function.  */
(*(expiration_routine)) (id);
else
//这里是Nucleus进行task的时间片处理的部分。
/* Call the task timeout function in the thread control
function.  */
TCC_Task_Timeout((NU_TASK *) pointer);
}

基本上Nucleus的timer主要流程就是这些了。

Avatar

帮同学宣传一下http://shop57644665.taobao.com/

一般我们看到的m0,SHX文件格式都是摩托罗拉文件格式,TI编译系统最后生成的m0文件也就是摩托罗拉文件格式。
其相关资料如下:
The Motorola S-record format is an ASCII encoding for binary data. It is also known as the SREC or S19 format.
An SREC format file consists of a series of ASCII records. All hexadecimal (hex) numbers are Big Endian.
The records have the following structure:

1. Start code, one character, an S.
2. Record type, one digit, 0 to 9, defining the type of the data field.
3. Byte count, two hex digits, indicating the number of bytes (hex digit pairs) that follow in the rest of the record (in the address, data and checksum fields).
4. Address, four, six, or eight hex digits as determined by the record type for the memory location of the first data byte.
5. Data, a sequence of 2n hex digits, for n bytes of the data.
6. Checksum, two hex digits - the one’s complement of the least significant byte sum of the values represented by the two hex digit pairs for the byte count, address and data fields.

There are eight record types, listed below:

Record Description Address Bytes Data Sequence
S0 Block header 2 Yes
S1 Data sequence 2 Yes
S2 Data sequence 3 Yes
S3 Data sequence 4 Yes
S5 Record count 2 No
S7 End of block 4 No
S8 End of block 3 No
S9 End of block 2 No

The S0 record data sequence contains vendor specific data rather than program data. The record count in the S5 record is stored in the 2-byte address field. The address field of the S7, S8, or S9 records may contain a starting address for the program.

S00F000068656C6C6F202020202000003C
S11F00007C0802A6900100049421FFF07C6C1B787C8C23783C6000003863000026

S11F001C4BFFFFE5398000007D83637880010014382100107C0803A64E800020E9
S111003848656C6C6F20776F726C642E0A0042
S5030003F9

S9030000FC

Start code Record type Byte count Address Data Checksum

Tagged with: , .
Page 5 of 8«12345678»