阅读源代码,收集了有以下信息:
\os\lib下内核的sensors.h, sensors.c
\os\dev下内核的battery-sensor.h
\MYdemo\user\cc2538-dev下的cc2538-sensors.h、 vdd3-sensor.h、 vdd3-sensor.c
\MYdemo\user\src下的smartrf-sensors.c
examples\mqtt-client\arch\cpu\cc2538的builtin-sensors.c, builtin-sensors.h
我们把源码放在一起,看一下它们的关系链:
1 // cc2538-sensors.h的内容 2 #define CC2538_SENSORS_VALUE_TYPE_RAW 0 /**< Request the raw reading */ 3 #define CC2538_SENSORS_VALUE_TYPE_CONVERTED 1 /**< Request the converted reading */ 4 #define CC2538_SENSORS_ERROR 0x80000000 /**< Generic Error */ 5 6 7 // vdd3-sensor.h的内容 8 #define VDD3_SENSOR "VDD3" 9 extern const struct sensors_sensor vdd3_sensor; 10 11 12 // vdd3-sensor.c的内容 13 static int 14 value(int type) 15 { 16 int raw = adc_get(SOC_ADC_ADCCON_CH_VDD_3, SOC_ADC_ADCCON_REF_INT, 17 SOC_ADC_ADCCON_DIV_512); 18 19 if(type == CC2538_SENSORS_VALUE_TYPE_RAW) { 20 return raw; 21 } else if(type == CC2538_SENSORS_VALUE_TYPE_CONVERTED) { 22 return raw * (3 * 1190) / (2047 << 4); 23 } 24 25 return CC2538_SENSORS_ERROR; 26 } 27 28 static int 29 configure(int type, int value) 30 { 31 return 0; 32 } 33 34 static int 35 status(int type) 36 { 37 return 1; 38 } 39 40 SENSORS_SENSOR(vdd3_sensor, VDD3_SENSOR, value, configure, status); 41 42 43 44 // smartrf-sensors.c的内容 45 /** \brief Exports a global symbol to be used by the sensor API */ 46 SENSORS(&als_sensor, &cc2538_temp_sensor, &vdd3_sensor); 47 48 49 50 // builtin-sensors.c的内容 51 static char * 52 vdd3_reading(void) 53 { 54 memset(tmp_buf, 0, TMP_BUF_SZ); 55 snprintf(tmp_buf, TMP_BUF_SZ, "\"VDD3 (mV)\":%d", 56 vdd3_sensor.value(CC2538_SENSORS_VALUE_TYPE_CONVERTED)); 57 return tmp_buf; 58 } 59 60 static void 61 vdd3_init(void) 62 { 63 SENSORS_ACTIVATE(vdd3_sensor); 64 }
我个人暂时理解如下:
1 通过struct sensors_sensor申明一个结构体变量vdd3_sensor,它有4个成员。
2 通过SENSORS_SENSOR对vdd3_sensor的4个成员进初始化。
3 通过SENSORS进行注册了,相当于AUTOSTART_PROCESSES(&xxxx),这样理解可能会好一些。
4 通过SENSORS_ACTIVATE对vdd3_sensor传感器进行激活!
5 通过结构体vdd3_sensor的value成员,读取传感器的值。
总体思维方向就是这样了,细节的话要阅读源码具体进行分析。。。。。。。
题外话,本来想在IAR试了一下随机函数的,但报内存不足了,玩了这么久也不知道代码多大,让我们来看一下:
晕,RAM快搞完了!马上就要蛋疼了~~~~~~~~~~
时间:2020-11-30
今天测试了一下xxxx_sensors,也验证了我之前的想法,竟然猜对了, 哈哈!!
AUTO_processes.c测试源码:
1 #include "contiki.h" 2 #include "leds.h" //测试1 3 #include "button-hal.h" 4 #include "sensors.h" 5 #include <stdio.h> /* For printf() */ 6 7 8 /*--------------------------测试打印功能-------------------------------------*/ 9 PROCESS(hello_process, "Hello process"); 10 11 PROCESS_THREAD(hello_process, ev, data) 12 { 13 PROCESS_BEGIN(); 14 while(1) { 15 printf("printf--Helloworld\n"); 16 UARTprintf("UARTprintf--hello-world\n\n"); 17 PROCESS_EXIT(); //退出进程,释放资源 18 } 19 PROCESS_END(); 20 } 21 22 23 /*-------------------------测试CC2538的PC3闪灯-------------------------------*/ 24 PROCESS(GpioIputOutputTest, "GpioIputOutputTest"); 25 PROCESS_THREAD(GpioIputOutputTest, ev, data) 26 { 27 static struct etimer et02; 28 PROCESS_BEGIN(); 29 30 etimer_set(&et02,CLOCK_SECOND/2); 31 while(1) 32 { 33 PROCESS_WAIT_EVENT(); 34 if(ev == PROCESS_EVENT_TIMER)leds_toggle(LEDS_GREEN); 35 etimer_reset(&et02); 36 } 37 PROCESS_END(); 38 } 39 40 41 /*-------------------------Button HAL AND sensor测试----------------------------------------*/ 42 #include "cc2538-sensors.h" 43 44 PROCESS(button_hal_example, "Button HAL Example"); 45 PROCESS_THREAD(button_hal_example, ev, data) 46 { 47 button_hal_button_t *btn; 48 PROCESS_BEGIN(); 49 btn = button_hal_get_by_index(0); 50 static u16_t d=1; 51 52 UARTprintf("Button HAL example.\n"); 53 UARTprintf("Device button count: %u.\n", button_hal_button_count); 54 55 SENSORS_ACTIVATE(vdd3_sensor); //激活传感器 56 SENSORS_ACTIVATE(cc2538_temp_sensor); 57 58 if(btn) { 59 UARTprintf("%s on pin %u with ID=0, Logic=%s, Pull=%s\n", 60 BUTTON_HAL_GET_DESCRIPTION(btn), btn->pin, 61 btn->negative_logic ? "Negative" : "Positive", 62 btn->pull == GPIO_HAL_PIN_CFG_PULL_UP ? "Pull Up" : "Pull Down"); 63 } 64 while(1) { 65 PROCESS_YIELD(); 66 if(ev == button_hal_press_event) { //有按下时, 67 UARTprintf("The number %d of Press.\n",d++); //打印第n次按下 68 UARTprintf("cc2538-value:V%d\n",vdd3_sensor.value(CC2538_SENSORS_VALUE_TYPE_CONVERTED)); //芯片供电,转换后的值 69 UARTprintf("cc2538-temp:%d\n",cc2538_temp_sensor.value(CC2538_SENSORS_VALUE_TYPE_CONVERTED)); //芯片温度,转换后的值 70 } 71 } 72 PROCESS_END(); 73 } 74 75 76 /*------------------------所有自启动模式的PROCESSES--------------------------*/ 77 AUTOSTART_PROCESSES( 78 &hello_process, // printf测试--通过 79 &GpioIputOutputTest, // led基本测试--通过 80 &button_hal_example // 按键和传感器测试--当前测试 81 );
运行效果图:
我是用IAR system系统在WINDOWS上测试的,当前CPU电压3.22V, 当前CPU温度24.5度,按下3次按键。
接下来,我们学习的内容是【 Shell 】交互操作,
是UNIX保留下来的产物,它是命令解释器,直接与内核交互的工具。