嵌入式系统开发(二)——字母的大小写转换

  在H文件中加入:

static inline ubase_t ToUpperCase(u8_t c) {
  if(!IsLowerCaseAlphabetChar(c))
    return c;
  return c - 32;
}

static inline ubase_t ToLowerCase(u8_t c) {
  if(!IsUpperCaseAlphabetChar(c))
    return c;
  return c + 32;
}

extern u8_t const __lowerCaseTbl[256];
static inline ubase_t ToLowerCaseFast(u8_t c) {
  return __lowerCaseTbl[c];
}

extern u8_t const __upperCaseTbl[256];
static inline ubase_t ToUpperCaseFast(u8_t c) {
  return __upperCaseTbl[c];
}

  在C文件中加入:

u8_t const __lowerCaseTbl[256] = {
  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
  0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
  0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
  0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
  0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
  0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
  0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
  0x78, 0x79, 0x7A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
  0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
  0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
  0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
  0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
  0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
  0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
  0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
  0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
  0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
  0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
  0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
  0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
  0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
  0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
  0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
  0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
  0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
  0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
  0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
  0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
};

u8_t const __upperCaseTbl[256] = {
  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
  0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
  0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
  0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
  0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
  0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
  0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
  0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
  0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
  0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
  0x58, 0x59, 0x5A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
  0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
  0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
  0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
  0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
  0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
  0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
  0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
  0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
  0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
  0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
  0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
  0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
  0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
  0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
  0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
  0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
};
  • static inline ubase_t ToUpperCase(u8_t c) ;

将给定字符转换为大写,如果字符不是字母则原样返回。

  • static inline ubase_t ToLowerCase(u8_t c);

将给定字符转换为小写,如果字符不是字母则原样返回。

  • static inline ubase_t ToLowerCaseFast(u8_t c) ;

将给定字符转换为小写,如果字符不是字母则原样返回。这是直接查表的快速版本!如果存储空间比较充裕,可以考虑这个。

  • static inline ubase_t ToUpperCaseFast(u8_t c) ;

将给定字符转换为大写,如果字符不是字母则原样返回。这是直接查表的快速版本!如果存储空间比较充裕,可以考虑这个。

现在我来比较一下ToLowerCase和ToLowerCaseFast的区别:

ToLowerCase的汇编代码如下:

        SECTION `.text`:CODE:NOROOT(1)
        THUMB
wrapper:
        LDR.N    R1,__ascInfoTbl
        LDRB     R1,[R0, R1]
        AND      R1,R1,#0x6
        CMP      R1,#+2
        IT       EQ
        ADDEQ    R0,R0,#+32
        BX       LR               ;; return

  ToLowerCaseFast的汇编代码如下:

        SECTION `.text`:CODE:NOROOT(1)
        THUMB
wrapper:
        LDR.N    R1,__lowerCaseTbl
        LDRB     R0,[R0, R1]
        BX       LR               ;; return

  那个高效,一看便知!

  另外,要讲一个知识点。我这里的4个函数都返回ubase_t类型,而不是u8_t类型,为什么呢?

  因为这样能避免勤劳的编译器替我加上“截断处理”。

  什么是截断处理?指的是C语言中,把32位整数赋值给8位或16位整数,这种大范围整数赋值给小范围整数的操作。

  编译器会根据硬件体系,加入一条或多条指令来完成这个转换。原因何在?因为ARM处理器总是用32位寄存器来传递函数参数和返回值,而C中的返回值和参数可以定义为8、16、32、64位宽度。比如:当返回值是8位整数时,就应该把函数内的32位运算寄存器内容进行截断,使之符合8位整数的取值范围。

  试验:如果把ToLowerCase函数的返回值定义为u8_t类型。在ARMv7的Thumb-2编译器中,编译器给出的代码如下:

        SECTION `.text`:CODE:NOROOT(1)
        THUMB
wrapper:
        LDR.N    R1,__ascInfoTbl
        LDRB     R1,[R0, R1]
        AND      R1,R1,#0x6
        CMP      R1,#+2
        IT       EQ
        ADDEQ    R0,R0,#+32
        UXTB     R0,R0
        BX       LR               ;; return

  可以看到,比返回ubase_t类型的ToLowerCase函数多出一条指令:

        UXTB     R0,R0

  这条指令就是为了把返回值截断成8位整数的。

  当然,不同的处理器,有不同的截断实现方式。只不过Thumb-2有现成的指令可用,因此还是挺高效的。

时间: 2024-10-02 15:38:56

嵌入式系统开发(二)——字母的大小写转换的相关文章

嵌入式系统开发学习(1)

嵌入式系统开发流程 嵌入式系统的一般开发流程如下: 嵌入式操作系统 管理资源 提高系统可靠性 硬件虚拟化 实时性能 多任务 现有的嵌入式操作系统 VxWorks pSOS PalmOS QNX OS-9 LynxOS WindowsCE uC/OS 嵌入式Linux FreeRTOS ARM体系架构 ARM:Advanced RISC Machines ARM处理器共有37个寄存器,分为若干个组(BANK). 大多数数据操作都在寄存器中完成. ARM分类 ARM7: 32bit 冯-诺依曼体系结

嵌入式系统开发流程

嵌入式系统开发与通用系统的开发有很大的区别.嵌入式系统的开发主要分为系统总体开发.嵌入式硬件开发和嵌入式软件开发3大部分. 在总体开发中,由于嵌入式系统与硬件依赖非常紧密,往往某些需求只能通过特定的硬件才能实现,因此需要进行处理器的选型,以更好地满足产品的需求.另外,对于有些硬件和软件都可以实现的功能,就需要在成本和性能上做出抉择.往往通过硬件实现会增加产品的成本,但是大大提高产品的性能和可靠性. 再次,开发环境的选择对于嵌入式系统的开发也有很大的影响.开发环境包括嵌入式操作系统的选择以及开发工

嵌入式系统开发——开篇

嵌入式系统开发中,C语言的地位是无法取代的,所以我用C语言为自己建立一个常用功能函数库.在基于单片机的开发中,经常会遇到“以时间换空间”或者“以空间换时间”的抉择.因为单片机不是运算能力有限,就是存储空间有限! 尽管现如今基于ARM核的微处理器已经普及,其运算能力和存储能力相对于以前8位时代,可谓是翻天覆地!但作为软件开发者,希望自己所写代码能具备移植性的同时还要尽量高效,是一种境界.这对于提升自己的编程水平.对C语言的应用能力,不失为一个好方法. 我在这里记录下我常用的程序库,方便自己和他人查

Python在实时嵌入式系统开发中扮演的五个主要角色-悦德财富

Python已经成为相当热门的程序语言.它以著名的Monty Python喜剧组命名,属于面向对象和解释型语言(非编译型).该属性使得Python具有良好的跨平台性,比如Linux和Windows,或是诸如Raspberry Pi等单板计算机.随着Python的日益普及,人们可能会问,在实时嵌入式系统中是否也有Python的一席之地. 答案是肯定的.下面是开发人员发现Python在实时嵌入式系统开发中有可能扮演的五个主要角色. 作用# 1设备调试和控制 在嵌入式软件开发过程中,开发人员常常需要分

嵌入式系统开发步骤

建立交叉开发环境 配置开发主机 移植bootloader linux内核移植 建立并烧写根文件系统到目标板 开发嵌入式应用程序 部署与配置系统 (1)建立交叉开发环境 开发主机的操作系统一般选用某一个发行版本的linux系统,如RedHatlinux等.linux内核版本可以根据项目的具体需求而定,如2.4内核或者2.6内核.选择定制安装或全部安装,通过网络下载相应的gcc交叉编译器进行安装(比如arm-linux-gcc,arm-uclibc-gcc等),或者安装产品厂家提供的交叉编译器. (

二码公益系统开发二码公益详解

二码公益开发,二码公益系统开发(苏念.188.1414.7927)二码公益平台开发 二码公益制度开发 二码公益项目开发 二码公益app开发 开发二码公益一公益,从人性角度思考,信息是人类获取互联网的最基本的需求,也就是类比食欲.社交对于人类来说属于第二个需求,所谓温饱思社交就是这个意思,因此社交网络是类比.合作是一种精神属性的行为,标志着人类进入了文明时代,因此子超把合作类比精神的层面.任何一个互联网产品的发展趋势都是先满足食欲,最后是精神的层面,我们判断未来的趋势也是可以这样类比判断的. 那么

转载:嵌入式系统开发步骤

转自:http://www.cnblogs.com/yxwkf/p/5173087.html 建立交叉开发环境配置开发主机移植bootloaderlinux内核移植建立并烧写根文件系统到目标板开发嵌入式应用程序部署与配置系统(1)建立交叉开发环境开发主机的操作系统一般选用某一个发行版本号的linux系统,如RedHatlinux等.linux内核版本号能够依据项目的详细需求而定,如2.4内核或者2.6内核.选择定制安装或所有安装,通过网络下载对应的gcc交叉编译器进行安装(比方arm-linux

二维码营销系统开发二维码营销系统模式详解

二维码营销系统开发(李想.185.6504.8478)二维码营销系统是什么?二维码营销系统有什么用?我为什么要需求购买二维码营销系统?二维码营销系统到底能给我带来解决什么问题?如果你想了解这些,那就跟随笔者一起往下看!市场营销是指,企业发现或挖掘准消费者需求,从整体氛围的营造以及自身产品形态的营造去推广和销售产品,主要是深挖产品的内涵,切合准消费者的需求,从而让消费者深刻了解该产品进而购买的过程.营销的目的是:产生可持续性收益.营销的本质是:抓住用户的需求,并快速把需求商品化.笔者下面介绍二维码

信盈达分享,如何学好嵌入式系统开发

一.嵌入式系统的概念着重理解"嵌入"的概念主要从三个方面上来理解.1.从硬件上,将基于CPU的处围器件,整合到CPU芯片内部,比如早期基于X86体系结构下的计算机,CPU只是有运算器和累加器的功能,一切芯片要造外部桥路来扩展实现,象串口之类的都是靠外部16C550/2的串口控制器芯片实现,而目前的这种串口控制器芯片早已集成到CPU内部,还有PC机有显卡,而多数嵌入式处理器都带有LCD控制器,但某种意义上就相当于显卡.比较高端的ARM类Intel Xscale架构下的IXP网络处理器CP

linux嵌入式系统开发,嵌入式编程入门教程

嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分.国内普遍认同的嵌入式系统定义为:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能.可靠性.成本.体积.功耗等严格要求的专用计算机系统.举些例子,手机.电子时钟.智能报警装置.自动监控器.出租车计费器等等都属于嵌入式系统. 嵌入式Linux的开发和研究是Linux领域研究的一个热点,目前已开发成功的嵌入式系统有一半以上都是Linux.Linux能够支持x86.ARM.MIPS.ALPHA.PowerPC等多种体系结构,目前