尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

嵌入式工程师进阶指南:RTOS线程入口参数使用(一)

嵌入式工程师进阶指南:RTOS线程入口参数使用(一) 以Rtthread 为例创建一个线程的方法分为两种分别是result rt_thread_init(thread1, thread1, thread1_entry,RT_NULL, thread1_stack[0], sizeof(thread1_stack), 200, 10);或者thread2_ptr rt_thread_create(thread2, thread2_entry,RT_NULL, 512, 250, 25);无论是哪种方法在线程函数入口参数的传入值都是RT_NULL。这代表着传入线程的参数没有使用到所以没有使用此功能。在很多嵌入操作系统都允许向线程函数的入口传递参数可见这个功能是实际有用的。在一些工程开发中这个传递参数还是能够实现非常重要的功能下面将简单介绍一下值向线程下传递和从线程中向上提取值的使用方法。现有一个LCD线程它的工作需要配置参数才能正常的初始化而项目设计要求在LCD线程运行之前通过主线程传递这些参数从而实现主线程对配置参数的全局统一控制而不是由LCD线程在分散在不同的配置文件中去读取。//lcd.h #ifndef APPLICATIONS_LCD_H_ #define APPLICATIONS_LCD_H_ #include board.h #include rtthread.h typedef enum //Font { SONG_STYLE12, SONG_STYLE14, SONG_STYLE16, SONG_STYLE18, SONG_STYLE20, SONG_STYLE22, SONG_STYLE24, SONG_STYLE26, }type_of_font; typedef struct{ uint8_t width_max; uint8_t high_max; type_of_font font; uint16_t font_color; uint16_t bkgd_color; }LcdCfg; void rth_lcd_create(LcdCfg* cfg); #endif /* APPLICATIONS_LCD_H_ */构造出LCD配置参数的结构体并添加到cfg.h下。//cfg.h #ifndef APPLICATIONS_CFG_H_ #define APPLICATIONS_CFG_H_ #include board.h #include rtthread.h #include lcd.h typedef struct{ LcdCfg lcdcfg; //添加其他配置结构体 }Dev_cfg_params; Dev_cfg_params* device_cfg_params_init(void); #endif /* APPLICATIONS_CFG_H_ */#include cfg.h static Dev_cfg_params cfgparams {0}; static void device_lcd_params_init() { cfgparams.lcdcfg.bkgd_color 0xFFFF; cfgparams.lcdcfg.font SONG_STYLE18; cfgparams.lcdcfg.font_color 0XABCD; cfgparams.lcdcfg.high_max 320; cfgparams.lcdcfg.width_max 240; } Dev_cfg_params* device_cfg_params_init() { device_lcd_params_init(); return cfgparams; }回到主线程要求处理以下内容定义配置参数的指针并指向配置参数变量的地址。将配置参数关于LCD的地址传递给LCD线程即可完成任务。//main.c #include cfg.h #include lcd.h #define LED_PIN GET_PIN(I, 8) int main(void) { rt_uint32_t count 1; Dev_cfg_params *params device_cfg_params_init(); rth_lcd_create(params-lcdcfg); rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); while(count) { rt_thread_mdelay(500); rt_pin_write(LED_PIN, PIN_HIGH); rt_thread_mdelay(500); rt_pin_write(LED_PIN, PIN_LOW); } return RT_EOK; }而在LCD线程中需要做以下处理。//lcd.c #include lcd.h static rt_thread_t rth_lcd RT_NULL; void lcd_handler(void* paramter) { LcdCfg *cfg (LcdCfg*)paramter; rt_kprintf( max width %d font_color %x\n,cfg-width_max,cfg-font_color); while(1) { rt_thread_mdelay(100); } } void rth_lcd_create(LcdCfg* cfg) { rth_lcd rt_thread_create(lcd, lcd_handler, cfg, 1024, 3, 100); rt_thread_startup(rth_lcd); }创建LCD线程的时候传入的线程参数为cfg指针。rth_lcd rt_thread_create(lcd, lcd_handler,cfg, 1024, 3, 100);这是第一步。在线程函数中需要将传递的通用参数paramter转换为LcdCfg的类型这里存在一步重要的类型转换。 LcdCfg *cfg (LcdCfg*)paramter;这是第二步。程序运行后输出信息如下有了配置参数之后既可以正常执行LCD设备的初始化。倘若还有其余的设备需要配置参数都可以通过在Dev_cfg_params结构体中添加内容后通过主线程调用分线程初始化的时候透过线程参数指针传递下来。
返回列表