运算符 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); } }
|