mbed 程序的语言基础

mBed程序采用C++进行编写,并在此基础上添加了一些自定义的函数和常量,所以我们在这有必要简单地了解一下相应的语言基础。

常量

常量是在程序运算过程中不变的量,常量在程序中经常直接出现,如数字1768;字符‘m’;字符串“mbed”等,此时只要求它们符合相应类型数据的表示方法。相应于各种数据类型,有整型常量、浮点型常量、字符型常量及字符串常量。
有时为了代码编写的方便,我们会用一个标识符来代表一个常量,通过宏定义预处理指令来实现,这就是常量定义,格式如下:
#define 标识符常量 由用户命名的标识符是符号常量名。
作为符号常量名,一般大写,一旦定义,在程序中凡是出现常量的地方均可用符号常量名来代替,对使用了符号常量的程序在编译前会以实际常量替代符号常量。mbed中定义的常量举例如下:
#define DEVICE_ANALOGIN         1 //是否支持ADC采集
#define DEVICE_ANALOGOUT        1 //是否支持DAC输出

   变量及其数据类型

只要没有超过内存限制,mBed可以按照C++语法自由定义变量,但变量的数据类型必须是以下类型之一:
bool布尔类型,只有true和false两个值,分别代表数值1和0,占用1个字节。
char字符类型,用来表示一个字符但存储为字符的ASCII值,数值范围是-128到127,占用1个字节。
byte字节类型,数值范围是0到255,占用1个字节。
short短整型,数值范围是-32768到32767,占用2个字节。
unsigned short无符号短整型,数值范围是0到65535,占用2个字节。
int整型,数值范围是-2^31到2^31-1,占用4个字节。
unsigned int无符号短整型,数值范围是0到2^32-1,占用4个字节。
long长整型,数值范围是–2^63到2^63-1,占用8个字节。
unsigned long无符号长整型,数值范围是0到2^63,占用8个字节。
float浮点型,用来表示小数,占用4个字节。
double高精度浮点型,用来表示小数,占用8个字节。
Array数组类型,如下面的定义:
int light[6] = {0, 20, 50, 75, 100,150};

    枚举

在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,LPC1768的UART只能是UART0、UART1、UART2、UART3,I2C只能是I2C0、I2C1、I2C2等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。为此,C/C++语言还提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。
定义一个变量是枚举类型,可以先定义一个枚举类型名,然后再说明这个变量是该枚举类型,也可以直接定义枚举类型变量,mBed中一般采用的是后者,如下面的例子:
typedefenum {
    SPI_0 = (int)LPC_SSP0_BASE,
    SPI_1 = (int)LPC_SSP1_BASE
} SPIName;
 typedefenum {
    I2C_0 = (int)LPC_I2C0_BASE,
    I2C_1 = (int)LPC_I2C1_BASE,
    I2C_2 = (int)LPC_I2C2_BASE
} I2CName;
对于枚举类型的使用,我们需要理解以下几点:
l  枚举元素不是变量,而是常数,因此枚举元素又称为枚举常量,因为是常量,所以不能对枚举元素进行赋值。  
l  枚举元素作为常量,它们是有值的,C/C++ 语言在编译时按定义的顺序使它们的值为 0,1,2,…;如果在定义枚举类型时指定元素的值,也可以改变枚举元素的值,如下面的定义,它就是从1开始的,需要注意的是,枚举元素的值是可以相同的。
typedefenum {
    PWM_1 = 1,
    PWM_2,
    PWM_3,
    PWM_4,
    PWM_5,
    PWM_6
} PWMName;
 typedefenum {
    // LPC Pin Names
    P0_0 = LPC_GPIO0_BASE,
          P0_1P0_2
    // mbed DIP Pin Names
    p5 = P0_9,
    p6 = P0_8,
    p7 = P0_7,
    p8 = P0_6,
    p9 = P0_0,
    p10 = P0_1,
    p11 = P0_18,
    p12 = P0_17,
   …
    // Not connected
    NC = (int)0xFFFFFFFF
} PinName;
l  枚举值可以用来作判断。枚举值的比较规则是:按其在说明时的顺序号比较,如,PWM5>PWM3。
l  一个整数不能直接赋给一个枚举变量,必须强制进行类型转换才能赋值。例如:  pwm=(enum PWMName)2;这个赋值的意思是,将顺序号为2 的枚举元素赋给 pwm,相当于pwm =PWM_2
在mBed代码中,有大量的枚举类型,而且和常量定义结合紧密,如下面的代码,后面的常量值都是枚举元素:
// Default peripherals
#define MBED_SPI0         p5, p6, p7, p8
#define MBED_SPI1         p11, p12, p13, p14
#define MBED_UART0        p9, p10
#define MBED_UART1        p13, p14
#define MBED_UART2        p28, p27
#define MBED_UARTUSB      USBTX, USBRX

   运算符

mBed使用C/C++的运算符,包括数学运算法、逻辑运算符和二进制运算符三部分内容。
         数学运算符:支持加(+),减(-),乘(*),除(/),求余(%)五种基本运算,需要注意的是,参与运算的数据类型的不同会导致结果的不同,如都是整型的情况下10/3=3,而有浮点型参与的情况下10/3.0=3.3,也就是说运算结果的数据类型和参与运算的数据类型相关,同时还要考虑运算结果的溢出情况,如下面的代码,理想结果是1000,实际结果却是232,就是1000溢出后的结果:
byte i=10;
    i=i*100;
         逻辑运算符:支持非(!),与(&&),或(||)三种逻辑运算符。
         二进制运算符:支持按位非(!),支持按位与(&),支持按位或(|),支持按位异或(^),左移(>>),右移(<<)6中二进制运算符。

    控制结构

mBed使用C/C++的控制结构即以下四种类型:
if…else条件判断结构,下面的代码只有val=1的时候才把led管脚置高:
if (val == 1) {
    led=1;
}
Else{
    led =0;
}
for: 循环结构,下面的代码会把管脚置高10次:
for (int i = 0; i < 10; i++) {
led=1;
wait(1);
}
switch case分支结构,下面的代码会根据val的值把不同的管脚置高:
switch (val) {
case 1:
led1=1;
break;
case 2:
led2=1;
break;
default: 
}
while/do while循环结构,下面的代码会把管脚置高512次,while/do while的区别是while里面的循环体有机会一次都不执行,而do while循环体至少执行1次:
int val = 0;
while (sensorValue < 512) {
led1=1;
wait(1);
val++;
}
 do {
led1=1;
wait(1);
val++;
} while (val < 512);
在循环结构中我们需要合理利用break和continue关键词,前面表示直接跳出循环而continue表示跳过本次循环,如下面的代码,当x值不在140到200之间时,程序将跳过后续的led1=1;wait(1);然后开始下一轮循环:但如果采用break,程序将直接跳出for循环,执行代码led1=1。
for (light = 0; light < 255; light++)
{
if ((x > 140) && (x < 200))
continue;
led1=1;
wait(1);
}
led2=1;

  时间等待函数

考虑到所有的应用都会用到时间等待函数,如前面例子中的wait,所以我们也把时间等待函数放在程序设计基础中介绍,mBed一共提供了三个时间等待函数,其具体实现如下:
void wait(float s) {
    wait_us(s * 1000000.0f);
}
void wait_ms(int ms) {
    wait_us(ms * 1000);
}
void wait_us(int us) {
    uint32_t start = us_ticker_read();
    while ((us_ticker_read() - start) < (uint32_t)us);
}
      从中可以看出,这三个函数的本质都是wait_us,需要注意的是,wait函数输入的是浮点类型,单位是秒,wait_ms和wait_us输入的都是整形,单位分别是毫秒和微妙,而这里用到的us_ticker_read()也是一个很常用的时间函数,表示系统reset后已经运行了多长时间了。
现在我们可以综合利用上面的一些函数完成新的HelloWorld程序了,我们新建一个名为HelloWorld2的工程,HelloWorld2.cpp的代码如下,程序上载后你就可以通过串口工具查看其运行效果,它会定时输出系统运行的时间:
#define DELAY_MS 500
DigitalOut led(LED1);
Serial pc(USBTX,USBRX);
 int main() {
    pc.baud(115200);
    while (1)
    {
                        led=1;
                        wait_ms(DELAY_MS);
                        pc.printf("hello world,system had passed %d ms.\n",us_ticker_read());
                        led=0;
                        wait_ms(DELAY_MS);
    }
}

http://blog.tianya.cn/post-7182283-114135201-1.shtml
http://blog.tianya.cn/post-7182283-114135350-1.shtml
http://blog.tianya.cn/post-7182283-114135844-1.shtml
http://blog.sina.com.cn/s/blog_15e2eae990102w9n9.html
http://blog.sina.com.cn/s/blog_15e2eae990102w9nb.html
http://blog.sina.com.cn/s/blog_15e2eae990102w9nd.html
http://blog.tianya.cn/post-7200700-114138258-1.shtml
http://blog.tianya.cn/post-7200700-114138509-1.shtml
http://blog.tianya.cn/post-7200700-114138881-1.shtml
http://blog.tianya.cn/post-7200700-114139103-1.shtml
http://blog.tianya.cn/post-7200700-114139506-1.shtml
http://blog.tianya.cn/post-7200700-114140033-1.shtml
http://blog.tianya.cn/post-7200700-114140618-1.shtml
http://blog.tianya.cn/post-7200700-114140869-1.shtml
http://blog.tianya.cn/post-7200700-114141082-1.shtml
http://blog.tianya.cn/post-7200700-114141292-1.shtml
http://www.cnblogs.com/SA-Jim/p/5367348.html
http://www.cnblogs.com/SA-Jim/p/5367356.html
http://www.cnblogs.com/SA-Jim/p/5367371.html
http://www.cnblogs.com/SA-Jim/p/5367388.html
http://www.cnblogs.com/SA-Jim/p/5367397.html
http://www.cnblogs.com/SA-Jim/p/5367407.html
http://www.cnblogs.com/SA-Jim/p/5367415.html
http://www.cnblogs.com/SA-Jim/p/5367422.html
http://tieba.baidu.com/p/4465149167
http://www.biyinjishi.com/kdoc/89456152/
http://www.biyinjishi.com/kdoc/89456149/
http://www.biyinjishi.com/kdoc/89456154/
http://www.biyinjishi.com/kdoc/89456155/
http://www.biyinjishi.com/kdoc/89456157/
http://www.biyinjishi.com/kdoc/89456146/
http://www.biyinjishi.com/kdoc/89456151/
http://www.biyinjishi.com/kdoc/89456147/
http://www.biyinjishi.com/kdoc/89456148/
http://www.biyinjishi.com/kdoc/89456144/
http://www.biyinjishi.com/kdoc/89456145/
http://www.biyinjishi.com/kdoc/89456150/
http://www.biyinjishi.com/kdoc/89456153/
http://www.biyinjishi.com/kdoc/89456156/

时间: 2024-10-24 14:44:41

mbed 程序的语言基础的相关文章

java--java语言基础(3)--黑马程序员

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- java语言基础(3) 主要内容:<运算符.键盘录入.顺序结构.选择结构if.三元运算符.选择结构switch.> 1 位运算符的基本用法1 位运算符:是对整数的二进制直接进行操作的 1.<< : 左移:左侧高位丢弃,右侧补0.左移一位,相当于原数 * 2 ; 实际移动的位数 = 要移动的位数 % 32; 2.>> : 带符号右移:右移一位,右侧的最低位丢弃,左侧高位

黑马程序员-c语言基础:各种数据类型的输出占位符

c语言中的输出操作相对java来说是比较麻烦的,每种数据类型的输出都有各自的占位符: 下面是各种数据类型的输出占位符: short/int : %d int a = 1; printf("这个整数是:%d", a); long: %ld; (long 是int得修饰,不能算是一种单独的数据类型,只是比int多了四个字节的存储空间) long long: %lld char : %c float/double : %f  float默认是6位小数输出:可以在%f中控制:例如:%.2f:输

java--java语言基础(4)--黑马程序员

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- java语言基础(4) 主要内容:<循环结构while.do...while.for.嵌套循环.跳转> 1 循环结构while语句的格式和基本使用 第一种循环结构: while循环: 格式: while(逻辑表达式){ //循环体代码.需要重复执行的代码 } 说明: 1.逻辑表达式:必须返回一个boolean类型的结果: 2.如果返回true:执行循环体: 3.循环体执行完毕,回到上面的&q

java--学习java从这里开始:Java语言基础(1)《基础知识篇》--黑马程序员

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Java语言基础(1) 从这篇日记开始说一些关于java的语言基础知识, 1  Java语言概述 java的创始人——詹姆斯·高斯林(James Gosling) 1977年获得了加拿大卡尔加里大学计算机科学学士学位,1983年获得了美国卡内基梅隆大学计算机科学博士学位,毕业后到IBM工作,设计IBM第7一代工作站NeWS系统,但不受重视.后来转至Sun公司,1990年,与Patrick,Na

Lua语言基础汇总(7) -- 协同程序

前言 协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西.从概念上讲,线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行.就是说,一个具有多个协同程序的程序在任意时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显式地要求挂起时,它的执行才会暂停. 协同程序基础 Lua将所有关于协同程序的函数放置在一个名为“coroutine”的table中.函数create

黑马程序员_Java环境搭建及语言基础

- - - - android培训.java培训.期待与您交流!- - - - - - JRE和JDK JRE:Java Runtime Environment,java运行环境. JDK:Java Development Kit,java开发工具包. 使用JDK开发java程序,交给JRE运行. JDK下载和安装 http://www.oracle.com/technetwork/java/javase/downloads/index.html JDK的目录结构 目录/文件名 功能说明   b

黑马程序员— C语言基础之内存剖析

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 在学习C语言基础知识时,老师对内存的分析很重视,几乎每个知识点都会帮我们分析内存存储情况,透过内存的分析也让我们对C语言有了更深的一些了解,C语言跟其他计算机语言相比,对内存的分析和要求更高,下面我们一起来了解和学习一下C语言的内存剖析,是我个人的在学习中的一些总结,如果问题或者不到位的地方也希望大家能够一起交流和指正. 第一讲  进制 进制是一种计数的方式,数值的表示形式,一般我们C语言主要

黑马程序员_ C语言基础(二)

概览 今天基础知识分为以下几点内容(注意:循环.条件语句在此不再赘述): 1.Hello World 2.运行过程 3.数据类型 4.运算符 5.常用函数 Hello World 既然是IOS开发系列首先看一下在Mac OS X中的C的运行 打开Xcode 选择命令行程序 填写项目名称并选择使用C语言 选择保存目录 自动生成如下代码 OK,在Xcode上我们编写自己的程序如下 // // main.c // C语言基础 // // Created by Kenshin Cui on 14-7-1

黑马程序员-C语言基础:指针类型与指针和数组、字符串的关系

//指针变量就是用来存储地址的,只能存储地址 格式:  int  *p;  这个p为指针变量:指针变量占8个字节 类型是用来说明这个指针指向的类型: 比如上边的int代表这个指针变量会指向int类型的存储空间: int *p = &a;//这样一句可以写,此时的*只是一个标志,表示这个*只是表示p是个指针: *p = &a;//这样写就错了:此时*p表示取p指向的空间的值: 指针疑问:指针既然都占据8个字节,那么为什么要划分类型, 是因为当用*p指针取值或者赋值的时候,知道该取几个字节,比