mbed-rtos的线程控制 线程控制的主要目的是允许用户建立多个线程并发执行,从而简化各类应用的开发,这样的需求是很常见的,如我们需要程序一方面处理串口数据,另一方便处理LED计数的变化,我们先看一个不用线程的实现: DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); Serial pc(USBTX,USBRX); uint8_t ledvalue=0; Ticker tick; void setLed(uint8_t val) { led1=val % 2; led2=(val /2 ) % 2; led3=(val /4 ) % 2; led4=(val /5 ) % 2; } void printstr() { pc.printf("Hello World,Now value is %d . \n",ledvalue); wait(1); } int main() { tick.attach(&printstr,2); while (1) { setLed(++ledvalue); wait(0.1); } } 但上载此程序后发现,因为在串口输出中需要1秒的等待,所以在这1秒内LED停止了计数过程,另外,如果你把tick的间隔时间设成小于1秒的后,LED计算根本就没有机会执行,显然,这样的处理很难满足实际的需求,下面我们给一个使用线程控制的实现(注释部分为传入函数参数的方式): #include "rtos.h" DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); Serial pc(USBTX,USBRX); uint8_t ledvalue=0; Ticker tick; void setLed(uint8_t val) { led1=val % 2; led2=(val /2 ) % 2; led3=(val /4 ) % 2; led4=(val /5 ) % 2; } void printstr(void const *args) { while (true) { pc.printf("Hello World,Now value is %d.\n",ledvalue); // pc.printf("Hello World,Now value is %d.\n",*(uint8_t *)args); Thread::wait(1000); } } int main() { Thread thread(printstr); Thread thread(printstr,&ledvalue); while (1) { setLed(++ledvalue); Thread::wait(100); } } 此时你就会发现串口输出和LED计算不再相互影响,就像两个程序独立执行一样,下面是串口输出的片断: Hello World,Now value is 174. Hello World,Now value is 184. Hello World,Now value is 195. Hello World,Now value is 205. Hello World,Now value is 215.
|