完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
根据官方提供的ULP计数例程里,主控代码里的ulp_edge_count 变量只在主控区域被引用,并没有跟ULP关联。而ULP代码里的计数变量edge_count也是跟主控代码没有任何关联。它们之间到底是如何交互数据的呢?
static void update_pulse_count(void){ const char* namespace = "plusecnt"; const char* count_key = "count"; ESP_ERROR_CHECK( nvs_flash_init() ); nvs_handle_t handle; ESP_ERROR_CHECK( nvs_open(namespace, NVS_READWRITE, &handle)); uint32_t pulse_count = 0; esp_err_t err = nvs_get_u32(handle, count_key, &pulse_count); assert(err == ESP_OK || err == ESP_ERR_NVS_NOT_FOUND); printf("Read pulse count from NVS: %5dn", (int)pulse_count); /* ULP program counts signal edges, convert that to the number of pulses */ uint32_t pulse_count_from_ulp = (ulp_edge_count & UINT16_MAX) / 2; /* In case of an odd number of edges, keep one until next time */ ulp_edge_count = ulp_edge_count % 2; printf("Pulse count from ULP: %5dn",(int) pulse_count_from_ulp); /* Save the new pulse count to NVS */ pulse_count += pulse_count_from_ulp; ESP_ERROR_CHECK(nvs_set_u32(handle, count_key, pulse_count)); ESP_ERROR_CHECK(nvs_commit(handle)); nvs_close(handle); printf("Wrote updated pulse count to NVS: %5dn", (int)pulse_count);} edge_detected: /* Reset debounce_counter to debounce_max_count */ move r3, debounce_max_count move r2, debounce_counter ld r3, r3, 0 st r3, r2, 0 /* Flip next_edge */ move r3, next_edge ld r2, r3, 0 add r2, r2, 1 and r2, r2, 1 st r2, r3, 0 /* Increment edge_count */ move r3, edge_count ld r2, r3, 0 add r2, r2, 1 st r2, r3, 0 /* Compare edge_count to edge_count_to_wake_up */ move r3, edge_count_to_wake_up ld r3, r3, 0 sub r3, r3, r2 jump wake_up, eq /* Not yet. End program */ halt |
|
相关推荐
1个回答
|
|
ULP(Ultra Low Power)处理器是一种低功耗协处理器,用于在主控处理器休眠时执行一些简单的任务,例如计数、测量等。在这种情况下,ULP处理器与主控处理器之间的数据交互通常通过非易失性存储器(如NVS)来实现。
在您提供的代码示例中,主控处理器和ULP处理器之间的数据交互是通过NVS实现的。以下是详细的步骤: 1. 初始化NVS:在主控代码中,首先调用`nvs_flash_init()`函数初始化NVS。 2. 打开NVS命名空间:使用`nvs_open()`函数打开一个NVS命名空间,这里命名为"plusecnt"。 3. ULP处理器执行任务:在ULP代码中,执行计数任务,并将计数结果存储在一个变量(如`edge_count`)中。 4. 保存计数结果到NVS:在ULP代码中,调用`ulp_set_wakeup_period()`函数设置唤醒周期,然后在唤醒时调用`update_pulse_count()`函数。在这个函数中,将ULP处理器中的计数结果(`edge_count`)保存到NVS中,使用`nvs_set_i32()`函数将整数类型数据保存到指定的键(如"count")。 5. 主控处理器读取计数结果:在主控代码中,当需要读取计数结果时,调用`nvs_get_i32()`函数从NVS中读取指定键("count")的值,并将结果存储到`ulp_edge_count`变量中。 6. 使用计数结果:主控处理器可以根据需要使用`ulp_edge_count`变量中的数据。 通过这种方式,ULP处理器与主控处理器之间的数据交互是通过NVS实现的,而不是直接在代码中关联变量。这种设计可以降低两者之间的耦合度,提高系统的可维护性和可扩展性。 |
|
|
|
只有小组成员才能发言,加入小组>>
343 浏览 0 评论
1192 浏览 1 评论
587浏览 6评论
484浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
468浏览 5评论
467浏览 4评论
443浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 23:04 , Processed in 0.626318 second(s), Total 46, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号