智能卡嵌入式开发的个人经验

来源:互联网 发布:ajax返回类型json数据 编辑:程序博客网 时间:2024/05/17 21:45

在各种平台下做过很多智能卡应用开发的COS研发人员应该都有一些感悟,就是在你从一个平台移植到另一个平台的时候如果代码设计的不够好,会经常重新根据芯片特性进行重新架构和设计,这是一个非常繁杂的任务,而且不能保证质量,耗时也长。

 

不同的芯片平台最主要的几个区别就是以下几点:芯片开发环境、芯片CPU位数(8位、16位或者32位)和主频、内存资源、ROM资源、FLASH或者EEPROM资源以及寄存器的参数等。这些芯片硬件参数的不同造成了移植COS代码的时候必须进行相关部分的重新编码。所以在一个平台上实现一个智能卡应用的COS设计时要充分考虑到以后的可移植性。

 

以下是我以前COS开发的一些经验:

有些平台的内存是对齐的,譬如三星的S3FS91J就是内存4字节对齐的例子,而有些平台例如英飞凌的SLE88CFX4000P则是1字节对齐,即不需要对齐的。这种内存属性的差异会对哪种实现方法造成影响呢?

大家用C语言开发最熟悉的莫过于结构体了,什么是结构体我在这就不说了,熟悉C语言的人应该都清楚,不知道的那就是不熟悉C语言。

我们在做内存管理的时候一般都会自己管理内存,用自己的方法去实现,这种管理如果没有特殊处理可能就会分配出非对齐的内存地址,这种实现在没有对齐要求的平台上使用是没有问题的,但是如果要移植到另一种对内存对齐有要求的平台上就会出现问题了,一个非对齐的内存指针指向一个结构体空间的话,从里面取出来的变量值是不对的,它的起始地址是该指针地址的对齐地址,所以按照偏移计算出来的位置就不对了,取出来的值自然就不正确。

其实有很多实际问题用结构体不能完全实现,譬如变长的,用结构体就很难把那种数据结构化,结构体主要还是面向于固定数据长度的一组数据,当然也有一些办法解决变长的问题,但是我个人觉得都不是太好。

我这里向大家介绍一种不使用结构体的方法,用起来也很方便,就是基址加偏移。下面我举个简单的例子:

 

结构体定义(这里只是示范,实际这种定义是有错误的,编译不会通过的):

typedef struct _DataGroup_
{

    WORD wValue1;

    WORD wValue2;

 

    WORD wIDLen;

    BYTE   bID[wIDLen];

 

    WORD wDataLen;   

    BYTE   bData[wDataLen];

 

}DataGroup, *PDataGroup;

 

基址加偏移的定义:

像上面这种结构我们就很难用一个结构体去表示,我们可以使用下面的宏来代替结构体。

#define DATA_GROUP_VALUE1               0

#define DATA_GROUP_VALUE2               (DATA_GROUP_VALUE1 + sizeof(WORD))

#define DATA_GROUP_IDLEN                 (DATA_GROUP_VALUE2 + sizeof(WORD))

#define DATA_GROUP_ID                       (DATA_GROUP_IDLEN + sizeof(WORD))

#define DATA_GROUP_DATALEN(Addr)   (DATA_GROUP_ID + RamLoadWord(Addr+DATA_GROUP_IDLEN))

#define DATA_GROUP_DATA(Addr)         (DATA_GROUP_DATALEN(Addr) + sizeof(WORD))

 

这几个宏定义我想应该不难理解吧,这种方式可以解决结构体不能解决的问题,任意数据格式基本都可以采用这种方式。

我们在使用的时候只需要用基址加上数据域的宏偏移就是该数据域的实际地址,然后使用RamLoad函数就可以把数据获取出来,譬如我要获取value2的值只需要调用RamLoadWord(Addr + DATA_GROUP_VALUE2)即可。

虽然不向结构体那样编码很方便,但是也不复杂,使用起来也很容易,最重要的是这种设计不需要管内存是否对齐,内存管理是如何实现的,基址加偏移是最通用的方式。

原创粉丝点击