Otpvondoiats opened a new pull request, #18134: URL: https://github.com/apache/nuttx/pull/18134
*Note: Please adhere to [Contributing Guidelines](https://github.com/apache/nuttx/blob/master/CONTRIBUTING.md).* ## Summary This patch series adds power-saving non-wakeup mode support for sensor drivers and optimizes the sensor RPMSG communication mechanism in multi-core scenarios. Key Changes 1. Non-Wakeup Mode Feature (Power Saving) Added support for set_nonwakeup operation to allow sensors to operate in a low-power mode where they don't wake up the remote CPU when it's in sleep state. How it works: Introduced nonwakeup flag in sensor user state and upper state structures When all users set non-wakeup mode, the sensor driver switches to non-wakeup operation In RPMSG context, non-wakeup sensors skip data transmission when remote CPU is sleeping Default mode is set to non-wakeup to optimize power consumption from initialization API Changes: Added SNIOC_SET_NONWAKEUP ioctl command Added set_nonwakeup() callback to sensor_ops_s structure Added nonwakeup field to sensor_ustate_s and sensor_state_s 2. RPMSG Advertisement Broadcast Optimization Changed the advertisement message broadcasting mechanism to use work queue instead of RPTUN thread context. Problem Solved: RPTUN thread cannot process RX messages while executing ns_bound callback Advertisement messages to remote core generate many ACK messages from remote When advertisement count exceeds IPC buffer capacity, RPTUN thread blocks This deadlock prevents normal sensor communication Solution: Use HPWORK queue to broadcast advertisement messages asynchronously RPTUN thread can continue processing incoming messages Prevents IPC buffer exhaustion and thread blocking 3. Mode Initialization Optimization Set non-wakeup mode as the default initialization state for power efficiency Ensures sensors start in low-power mode unless explicitly changed by users Optimizes overall system power consumption Technical Details Modified Files: drivers/sensors/sensor.c - Core sensor driver with non-wakeup logic drivers/sensors/sensor_rpmsg.c - RPMSG communication with power management include/nuttx/sensors/ioctl.h - Added SNIOC_SET_NONWAKEUP command include/nuttx/sensors/sensor.h - Extended sensor operations and state structures include/nuttx/uorb.h - Added non-wakeup support to uORB interface Key Implementation: ## Impact - Users Power Savings: Significant reduction in power consumption for sensor applications Flexibility: Users can control sensor wakeup behavior per-subscription Reliability: Eliminates RPMSG communication deadlocks in multi-core systems - Performance Improved: Asynchronous advertisement broadcasting reduces IPC latency Optimized: Non-wakeup sensors don't generate unnecessary interrupts Stable: No more RPTUN thread blocking issues - Compatibility API Extension: New set_nonwakeup operation is optional for drivers Backward Compatible: Existing drivers continue to work without modification Default Behavior: Non-wakeup mode is default, can be changed via ioctl - Multi-Core Communication Fixed: RPMSG thread blocking when advertising multiple sensors Improved: Better handling of IPC buffer constraints Robust: Worker-based broadcasting prevents deadlocks - Power Management Optimized: Sensors in non-wakeup mode don't wake sleeping remote cores Configurable: Per-user control over wakeup behavior Efficient: Default non-wakeup mode reduces unnecessary power consumption ## Testing ~~~ ap> uorb_listener sensor_accel Mointor objects num:1 object_name:sensor_accel, object_instance:0 sensor_accel(now:17966607100):timestamp:17949998830,x:0.382649,y:0.311582,z:9.802140,temperature:29.080078 sensor_accel(now:17966648200):timestamp:17950040430,x:0.308429,y:0.244545,z:9.711160,temperature:29.080078 [01/20 21:50:08] [ 0] [audio] CPU USAGE: busy=1 cpu_sleep=0 bus_sleep=0 subsys_sleep=99(pd) [01/20 21:50:08] [ 5] [sensor] [BMI270]activate: type:1, enable:1 [01/20 21:50:08] [ 5] [sensor] [BMI270]Activate config: 1 0 0 [01/20 21:50:08] [ 5] [sensor] [BMI270]Interval config: 40000 0 [01/20 21:50:08] [ 5] [sensor] [BMI270]Clear status [01/20 21:50:08] [ 5] [sensor] [BMI270]Batch config: wtm: 1 7 accel: 40000 1 gyro: 0 0 sensor_accel(now:17966687400):timestamp:17950079230,x:0.408985,y:0.270881,z:9.761438,temperature:29.080078 sensor_accel(now:17966728900):timestamp:17950120930,x:0.349130,y:0.275669,z:9.778198,temperature:29.080078 sensor_accel(now:17966769200):timestamp:17950161230,x:0.430533,y:0.290035,z:9.782987,temperature:29.080078 sensor_accel(now:17966809300):timestamp:17950201430,x:0.401803,y:0.325948,z:9.785380,temperature:29.080078 sensor_accel(now:17966849400):timestamp:17950241630,x:0.344342,y:0.313977,z:9.845236,temperature:29.080078 sensor_accel(now:17966889600):timestamp:17950281830,x:0.399408,y:0.225391,z:9.871572,temperature:29.080078 sensor_accel(now:17966929900):timestamp:17950322130,x:0.356313,y:0.297217,z:9.864389,temperature:29.080078 sensor_accel(now:17966970000):timestamp:17950362330,x:0.341948,y:0.282852,z:9.696795,temperature:29.080078 sensor_accel(now:17967010500):timestamp:17950402630,x:0.456869,y:0.280458,z:9.845236,temperature:29.080078 sensor_accel(now:17967050700):timestamp:17950442830,x:0.382649,y:0.266093,z:9.787775,temperature:29.080078 sensor_accel(now:17967090900):timestamp:17950483030,x:0.332371,y:0.345101,z:9.759045,temperature:29.080078 sensor_accel(now:17967131000):timestamp:17950523230,x:0.341948,y:0.249333,z:9.766227,temperature:29.080078 sensor_accel(now:17967171300):timestamp:17950563530,x:0.361101,y:0.282852,z:9.735102,temperature:29.080078 sensor_accel(now:17967211400):timestamp:17950603730,x:0.373072,y:0.232574,z:9.792563,temperature:29.080078 sensor_accel(now:17967251600):timestamp:17950644030,x:0.420956,y:0.328342,z:9.893120,temperature:29.080078 Object name:sensor_accel0, recieved:17 Total number of received Message:17/17 ap> [01/20 21:50:09] [ 5] [sensor] [BMI270]activate: type:1, enable:0 [01/20 21:50:09] [ 2] [sensor] [BMI270]Activate config: 0 0 0 [01/20 21:50:09] [ 2] [sensor] [BMI270]Clear status [01/20 21:50:09] [ 2] [sensor] [BMI270]Batch config: wtm: 0 0 accel: 0 0 gyro: 0 0 uorb_listener -r 50 -n 100 sensor_accel Mointor objects num:1 object_name:sensor_accel, object_instance:0 sensor_accel(now:17979050800):timestamp:17962432230,x:0.310823,y:0.318765,z:9.814111,temperature:29.154297 [01/20 21:50:20] [ 0] [audio] CPU USAGE: busy=1 cpu_sleep=0 bus_sleep=0 subsys_sleep=99(pd) sensor_accel(now:17979091900):timestamp:17962472430,x:0.377861,y:0.290035,z:9.871572,temperature:29.154297 sensor_accel(now:17979108800):timestamp:17962491130,x:0.344342,y:0.328342,z:9.773410,temperature:29.154297 sensor_accel(now:17979132100):timestamp:17962512630,x:0.377861,y:0.273275,z:9.787775,temperature:29.154297 [01/20 21:50:20] [ 5] [sensor] [BMI270]activate: type:1, enable:1 [01/20 21:50:20] [ 5] [sensor] [BMI270]Activate config: 1 0 0 [01/20 21:50:20] [ 5] [sensor] [BMI270]Interval config: 40000 0 [01/20 21:50:20] [ 5] [sensor] [BMI270]Clear status [01/20 21:50:20] [ 5] [sensor] [BMI270]Batch config: wtm: 1 7 accel: 40000 1 gyro: 0 0 [01/20 21:50:20] [ 5] [sensor] [BMI270]set interval: type:1, freq:50.000000 [01/20 21:50:20] [ 5] [sensor] [BMI270]batch: type:1 latency_us:0 [01/20 21:50:20] [ 2] [sensor] [BMI270]Interval config: 20000 0 [01/20 21:50:20] [ 2] [sensor] [BMI270]Clear status [01/20 21:50:20] [ 2] [sensor] [BMI270]Batch config: wtm: 1 7 accel: 20000 1 gyro: 0 0 [01/20 21:50:20] [ 2] [sensor] [BMI270]notify interval: 0 20000 sensor_accel(now:17979156100):timestamp:17962531230,x:0.380255,y:0.258910,z:9.744678,temperature:29.154297 sensor_accel(now:17979169100):timestamp:17962551430,x:0.341948,y:0.294823,z:9.723131,temperature:29.154297 sensor_accel(now:17979192700):timestamp:17962573030,x:0.329977,y:0.249333,z:9.723131,temperature:29.154297 sensor_accel(now:17979209300):timestamp:17962591730,x:0.464052,y:0.278064,z:9.759045,temperature:29.154297 sensor_accel(now:17979233100):timestamp:17962613330,x:0.413774,y:0.330736,z:9.852418,temperature:29.154297 sensor_accel(now:17979249600):timestamp:17962631930,x:0.363495,y:0.273275,z:9.792563,temperature:29.154297 sensor_accel(now:17979273200):timestamp:17962653530,x:0.447293,y:0.306794,z:9.687218,temperature:29.154297 sensor_accel(now:17979289700):timestamp:17962672130,x:0.375466,y:0.282852,z:9.754255,temperature:29.154297 sensor_accel(now:17979313400):timestamp:17962693730,x:0.385043,y:0.335524,z:9.835659,temperature:29.154297 sensor_accel(now:17979330000):timestamp:17962712330,x:0.337159,y:0.249333,z:9.773410,temperature:29.154297 sensor_accel(now:17979353600):timestamp:17962733930,x:0.308429,y:0.285246,z:9.802140,temperature:29.154297 sensor_accel(now:17979370200):timestamp:17962752630,x:0.442504,y:0.306794,z:9.739890,temperature:29.154297 sensor_accel(now:17979393700):timestamp:17962774130,x:0.322794,y:0.316371,z:9.830871,temperature:29.154297 sensor_accel(now:17979410400):timestamp:17962792830,x:0.346736,y:0.302006,z:9.830871,temperature:29.154297 sensor_accel(now:17979433900):timestamp:17962814430,x:0.380255,y:0.246939,z:9.790169,temperature:29.154297 sensor_accel(now:17979450900):timestamp:17962833030,x:0.449687,y:0.258910,z:9.828476,temperature:29.154297 sensor_accel(now:17979474500):timestamp:17962854730,x:0.440110,y:0.218209,z:9.744678,temperature:29.154297 sensor_accel(now:17979491000):timestamp:17962873330,x:0.432927,y:0.227785,z:9.763833,temperature:29.154297 sensor_accel(now:17979514600):timestamp:17962894930,x:0.356313,y:0.282852,z:9.816505,temperature:29.154297 sensor_accel(now:17979531100):timestamp:17962913530,x:0.358707,y:0.290035,z:9.830871,temperature:29.154297 sensor_accel(now:17979554800):timestamp:17962935130,x:0.313217,y:0.311582,z:9.828476,temperature:29.154297 sensor_accel(now:17979571400):timestamp:17962953830,x:0.325188,y:0.246939,z:9.773410,temperature:29.154297 sensor_accel(now:17979595000):timestamp:17962975330,x:0.349130,y:0.234968,z:9.794957,temperature:29.154297 sensor_accel(now:17979611600):timestamp:17962994030,x:0.351524,y:0.294823,z:9.782987,temperature:29.154297 sensor_accel(now:17979635300):timestamp:17963015630,x:0.310823,y:0.258910,z:9.826082,temperature:29.154297 sensor_accel(now:17979651900):timestamp:17963034230,x:0.351524,y:0.275669,z:9.778198,temperature:29.154297 sensor_accel(now:17979675500):timestamp:17963055830,x:0.432927,y:0.328342,z:9.651305,temperature:29.154297 sensor_accel(now:17979692100):timestamp:17963074430,x:0.303640,y:0.292429,z:9.816505,temperature:29.154297 sensor_accel(now:17979715900):timestamp:17963096030,x:0.291669,y:0.309188,z:9.771015,temperature:29.154297 sensor_accel(now:17979732300):timestamp:17963114730,x:0.294064,y:0.258910,z:9.718343,temperature:29.154297 sensor_accel(now:17979756100):timestamp:17963136330,x:0.298852,y:0.285246,z:9.850024,temperature:29.154297 sensor_accel(now:17979772500):timestamp:17963154930,x:0.327582,y:0.287640,z:9.761438,temperature:29.154297 sensor_accel(now:17979796000):timestamp:17963176530,x:0.373072,y:0.299611,z:9.756650,temperature:29.154297 sensor_accel(now:17979812800):timestamp:17963195230,x:0.351524,y:0.309188,z:9.823688,temperature:29.154297 sensor_accel(now:17979836200):timestamp:17963216830,x:0.380255,y:0.232574,z:9.718343,temperature:29.154297 sensor_accel(now:17979853100):timestamp:17963235430,x:0.353919,y:0.275669,z:9.737496,temperature:29.154297 sensor_accel(now:17979876700):timestamp:17963257030,x:0.349130,y:0.290035,z:9.821294,temperature:29.154297 sensor_accel(now:17979893300):timestamp:17963275630,x:0.394620,y:0.311582,z:9.737496,temperature:29.154297 sensor_accel(now:17979916900):timestamp:17963297230,x:0.353919,y:0.335524,z:9.747073,temperature:29.154297 sensor_accel(now:17979933500):timestamp:17963315930,x:0.385043,y:0.237362,z:9.737496,temperature:29.154297 sensor_accel(now:17979957200):timestamp:17963337530,x:0.356313,y:0.275669,z:9.835659,temperature:29.154297 sensor_accel(now:17979973800):timestamp:17963356130,x:0.365890,y:0.251727,z:9.835659,temperature:29.154297 sensor_accel(now:17979997400):timestamp:17963377730,x:0.394620,y:0.239756,z:9.778198,temperature:29.154297 sensor_accel(now:17980014000):timestamp:17963396330,x:0.356313,y:0.282852,z:9.742285,temperature:29.154297 sensor_accel(now:17980037800):timestamp:17963417930,x:0.320400,y:0.246939,z:9.780592,temperature:29.154297 sensor_accel(now:17980054200):timestamp:17963436630,x:0.394620,y:0.309188,z:9.732708,temperature:29.154297 sensor_accel(now:17980078000):timestamp:17963458230,x:0.296458,y:0.263698,z:9.785380,temperature:29.152344 sensor_accel(now:17980094400):timestamp:17963476830,x:0.435322,y:0.294823,z:9.806929,temperature:29.152344 sensor_accel(now:17980118100):timestamp:17963498430,x:0.318006,y:0.299611,z:9.821294,temperature:29.152344 sensor_accel(now:17980134800):timestamp:17963517130,x:0.344342,y:0.234968,z:9.771015,temperature:29.152344 sensor_accel(now:17980158300):timestamp:17963538630,x:0.337159,y:0.282852,z:9.763833,temperature:29.152344 sensor_accel(now:17980174900):timestamp:17963557330,x:0.373072,y:0.275669,z:9.778198,temperature:29.152344 sensor_accel(now:17980198400):timestamp:17963578930,x:0.332371,y:0.306794,z:9.840447,temperature:29.152344 sensor_accel(now:17980215200):timestamp:17963597530,x:0.399408,y:0.278064,z:9.790169,temperature:29.152344 sensor_accel(now:17980238600):timestamp:17963619130,x:0.380255,y:0.304400,z:9.818899,temperature:29.152344 sensor_accel(now:17980255500):timestamp:17963637730,x:0.380255,y:0.275669,z:9.763833,temperature:29.152344 sensor_accel(now:17980279200):timestamp:17963659330,x:0.310823,y:0.275669,z:9.790169,temperature:29.152344 sensor_accel(now:17980295600):timestamp:17963678030,x:0.358707,y:0.278064,z:9.792563,temperature:29.152344 sensor_accel(now:17980319400):timestamp:17963699630,x:0.356313,y:0.256516,z:9.792563,temperature:29.152344 sensor_accel(now:17980335900):timestamp:17963718230,x:0.356313,y:0.270881,z:9.778198,temperature:29.152344 sensor_accel(now:17980359500):timestamp:17963739830,x:0.318006,y:0.299611,z:9.732708,temperature:29.152344 sensor_accel(now:17980376100):timestamp:17963758530,x:0.382649,y:0.280458,z:9.735102,temperature:29.152344 sensor_accel(now:17980399900):timestamp:17963780130,x:0.380255,y:0.270881,z:9.804534,temperature:29.152344 sensor_accel(now:17980416300):timestamp:17963798730,x:0.351524,y:0.282852,z:9.759045,temperature:29.152344 sensor_accel(now:17980440000):timestamp:17963820330,x:0.377861,y:0.280458,z:9.828476,temperature:29.152344 sensor_accel(now:17980456600):timestamp:17963838930,x:0.339553,y:0.278064,z:9.821294,temperature:29.152344 sensor_accel(now:17980480200):timestamp:17963860530,x:0.329977,y:0.268487,z:9.744678,temperature:29.152344 sensor_accel(now:17980496800):timestamp:17963879130,x:0.358707,y:0.201449,z:9.759045,temperature:29.152344 sensor_accel(now:17980520500):timestamp:17963900730,x:0.277304,y:0.316371,z:9.768621,temperature:29.152344 sensor_accel(now:17980537000):timestamp:17963919430,x:0.401803,y:0.302006,z:9.809322,temperature:29.152344 sensor_accel(now:17980560600):timestamp:17963940930,x:0.318006,y:0.230180,z:9.715948,temperature:29.152344 sensor_accel(now:17980577300):timestamp:17963959630,x:0.425745,y:0.323553,z:9.802140,temperature:29.152344 sensor_accel(now:17980600600):timestamp:17963981130,x:0.301246,y:0.306794,z:9.794957,temperature:29.152344 sensor_accel(now:17980617400):timestamp:17963999830,x:0.401803,y:0.251727,z:9.840447,temperature:29.152344 sensor_accel(now:17980640800):timestamp:17964021330,x:0.358707,y:0.304400,z:9.715948,temperature:29.152344 sensor_accel(now:17980657800):timestamp:17964040030,x:0.420956,y:0.227785,z:9.761438,temperature:29.152344 sensor_accel(now:17980681400):timestamp:17964061630,x:0.327582,y:0.239756,z:9.823688,temperature:29.152344 sensor_accel(now:17980697900):timestamp:17964080230,x:0.365890,y:0.290035,z:9.799746,temperature:29.152344 sensor_accel(now:17980721500):timestamp:17964101830,x:0.344342,y:0.313977,z:9.833264,temperature:29.152344 sensor_accel(now:17980738100):timestamp:17964120530,x:0.365890,y:0.309188,z:9.787775,temperature:29.152344 sensor_accel(now:17980761700):timestamp:17964142030,x:0.353919,y:0.311582,z:9.787775,temperature:29.152344 sensor_accel(now:17980778300):timestamp:17964160730,x:0.394620,y:0.266093,z:9.799746,temperature:29.152344 sensor_accel(now:17980801900):timestamp:17964182230,x:0.387437,y:0.285246,z:9.895514,temperature:29.152344 sensor_accel(now:17980818600):timestamp:17964200930,x:0.387437,y:0.275669,z:9.766227,temperature:29.152344 sensor_accel(now:17980842200):timestamp:17964222530,x:0.406591,y:0.275669,z:9.814111,temperature:29.152344 sensor_accel(now:17980858800):timestamp:17964241130,x:0.361101,y:0.251727,z:9.759045,temperature:29.152344 sensor_accel(now:17980882400):timestamp:17964262730,x:0.370678,y:0.321159,z:9.811717,temperature:29.152344 sensor_accel(now:17980899000):timestamp:17964281430,x:0.351524,y:0.266093,z:9.782987,temperature:29.152344 sensor_accel(now:17980922800):timestamp:17964303030,x:0.332371,y:0.294823,z:9.852418,temperature:29.152344 sensor_accel(now:17980939300):timestamp:17964321630,x:0.341948,y:0.280458,z:9.859601,temperature:29.152344 sensor_accel(now:17980962800):timestamp:17964343230,x:0.353919,y:0.364255,z:9.806929,temperature:29.152344 sensor_accel(now:17980979400):timestamp:17964361830,x:0.418562,y:0.304400,z:9.766227,temperature:29.152344 sensor_accel(now:17981002900):timestamp:17964383430,x:0.344342,y:0.275669,z:9.811717,temperature:29.152344 sensor_accel(now:17981019800):timestamp:17964402130,x:0.346736,y:0.292429,z:9.785380,temperature:29.152344 sensor_accel(now:17981043100):timestamp:17964423630,x:0.341948,y:0.309188,z:9.756650,temperature:29.152344 sensor_accel(now:17981060100):timestamp:17964442230,x:0.385043,y:0.323553,z:9.751862,temperature:29.152344 Object name:sensor_accel0, recieved:100 Total number of received Message:100/100 ap> uorb_listener -i sensor_accel Topic [sensor_accel0] info: name:BMI270 Accelerometer vendor:Bosch version:3 power:0.010000 max_range:78.480003 resolution:0.002400 min_delay:20000 max_delay:40000 fifo_reserved_event_count:40 fifo_max_event_count:40 ap> [01/20 21:51:06] [ 5] [sensor] [BMI270]activate: type:1, enable:1 [01/20 21:51:06] [ 5] [sensor] [BMI270]Activate config: 1 0 0 [01/20 21:51:06] [ 5] [sensor] [BMI270]Interval config: 40000 0 [01/20 21:51:06] [ 5] [sensor] [BMI270]Clear status [01/20 21:51:06] [ 5] [sensor] [BMI270]Batch config: wtm: 1 7 accel: 40000 1 gyro: 0 0 [01/20 21:51:06] [ 5] [sensor] [BMI270]get_info: type:1 [01/20 21:51:06] [ 5] [sensor] [BMI270]activate: type:1, enable:0 [01/20 21:51:06] [ 2] [sensor] [BMI270]Activate config: 0 0 0 [01/20 21:51:06] [ 2] [sensor] [BMI270]Clear status [01/20 21:51:06] [ 2] [sensor] [BMI270]Batch config: wtm: 0 0 accel: 0 0 gyro: 0 0 ap> uorb_listener -f sensor_accel Result: Topic [sensor_accel0] flush: SUCCESS. Total number of flush topics: 1 ap> [01/20 21:50:43] [ 0] [audio] CPU USAGE: busy=1 cpu_sleep=0 bus_sleep=0 subsys_sleep=99(pd) [01/20 21:50:43] [ 5] [sensor] [BMI270]activate: type:1, enable:1 [01/20 21:50:44] [ 5] [sensor] [BMI270]Activate config: 1 0 0 [01/20 21:50:44] [ 5] [sensor] [BMI270]Interval config: 40000 0 [01/20 21:50:44] [ 5] [sensor] [BMI270]Clear status [01/20 21:50:44] [ 5] [sensor] [BMI270]Batch config: wtm: 1 7 accel: 40000 1 gyro: 0 0 [01/20 21:50:44] [ 5] [sensor] [BMI270]flush: type:1 [01/20 21:50:44] [ 5] [sensor] [BMI270]activate: type:1, enable:0 [01/20 21:50:44] [ 2] [sensor] [BMI270]Activate config: 0 0 0 [01/20 21:50:44] [ 2] [sensor] [BMI270]Clear status [01/20 21:50:44] [ 2] [sensor] [BMI270]Batch config: wtm: 0 0 accel: 0 0 gyro: 0 0 ~~~ -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
