如何配置PMU?

前段时间通过大家的帮助,完成了上AWS云的测试,现在想尝试使用蓝牙控制模块发送数据到云
但是发现一启用蓝牙功能,mbedtls就无法申请到足够的空间,导致无法继续运行,查看资料,RTL8720DN的大核片上SRAM足足高达512k,不应该会出现这样的情况才对

开始尝试确认当前剩余堆栈大小,将应用程序全部注释,开启一个线程来周期查询当前剩余堆栈大小,通过API rtw_getFreeHeapSize() 获取得到的值为236768,计算了一下剩余大约231kb的内存可支配,跟手册上的完全看上去并不符合


手册上说可以通过PMU,电源控制管理单元来配置SRAM,但是不知该如何配置,希望能得到帮助,谢谢

下面是我上电后运行的代码

void debug_init(void)

{

	if (!(xTaskCreate(km4_debug_task, "km4_debug_task", 1024, NULL, TaskCreate_Level_Debug, NULL)))

	{

		CTR_IOT_ERROR("%s xTaskCreate fail", __func__);

	}

}



VOID app_pmu_init(VOID)

{

	if (BKUP_Read(BKUP_REG0) & BIT_SW_SIM_RSVD)

	{

		return;

	}



	// pmu_set_sleep_type(SLEEP_PG);

	pmu_set_sleep_type(SLEEP_CG);



	/* if wake from deepsleep, that means we have released wakelock last time */

	//if (SOCPS_DsleepWakeStatusGet() == TRUE) {

	//	pmu_set_sysactive_time(2);

	//	pmu_release_wakelock(PMU_OS);

	//	pmu_tickless_debug(ENABLE);

	//}

}

//default main

int main(void)

{

	SystemSetCpuClk(CLK_KM4_200M);

	if (wifi_config.wifi_ultra_low_power &&

		wifi_config.wifi_app_ctrl_tdma == FALSE)

	{

		SystemSetCpuClk(CLK_KM4_100M);

		CTR_IOT_WARN("SystemSetCpuClk CLK_KM4_100M");

	}

	InterruptRegister(IPC_INTHandler, IPC_IRQ, (u32)IPCM0_DEV, 5);

	InterruptEn(IPC_IRQ, 5);



#ifdef CONFIG_MBED_TLS_ENABLED

	app_mbedtls_rom_init();

#endif

	//app_init_debug();



	/* init console */

	shell_recv_all_data_onetime = 1;

	shell_init_rom(0, 0);

	shell_init_ram();

	ipc_table_init();



	/* Register Log Uart Callback function */

	InterruptRegister((IRQ_FUN)shell_uart_irq_rom, UART_LOG_IRQ, (u32)NULL, 5);

	InterruptEn(UART_LOG_IRQ, 5);



	if (TRUE == SOCPS_DsleepWakeStatusGet())

	{

		app_dslp_wake();

	}
#ifdef CONFIG_FTL_ENABLED

	app_ftl_init();

#endif



#if defined(CONFIG_WIFI_NORMAL) && defined(CONFIG_NETWORK)

	rtw_efuse_boot_write();



	/* pre-processor of application example */

	// pre_example_entry();



	// wlan_network();

	/* Execute application example */

	// example_entry();

#endif



#if defined(CONFIG_EQC) && CONFIG_EQC

	//EQC_test_entry();

#endif

	app_start_autoicg();

	// app_shared_btmem(ENABLE);



	app_pmu_init();



	if ((BKUP_Read(0) & BIT_KEY_ENABLE))

		app_keyscan_init(FALSE); /* 5uA */

	if ((BKUP_Read(0) & BIT_CAPTOUCH_ENABLE))

		app_captouch_init(); /* 1uA */

	// if ((BKUP_Read(0) & BIT_GPIO_ENABLE))

	// 	app_hp_jack_init();



	class_variable_event_group = xEventGroupCreate();

	app_init_debug();

	// ctr_timer_init();

	// ctr_gpio_init();

	// app_wifi_init();

	// // app_ble_init();

	// main_user_loop();

	debug_init();

	//DBG_8195A("M4U:%d \n", RTIM_GetCount(TIMM05));

	/* Enable Schedule, Start Kernel */

	vTaskStartScheduler();

}


1 Like

问题非常详尽,赞一个先👍

如你所说,你分享的资料截图区域第一部分就提到了,512SRAM被切为两块,因此每块最大256KB,这是为了方便CPU和DMA同时存取SRAM

有办法可以在不增加额外的SRAM外,节省片上RAM的空间嘛 :joy:

剩余堆栈太小已不能够正常申请足够的内存来使用了

1 Like

查了一下application note,发现MK4是能用456KB 连续的SRAM的,不知道你的程序做了什么,吃掉这么多RAM。。。
但是也可以用编译之后产生的map文件来分析一下你的程序的RAM使用情况,或者看一下linker文件,看看是不是SRAM的分区被刻意改小了

谢谢您的帮助与建议,我前段时间已经尝试注释一些没有必要的功能宏,并关掉并减少其它线程的stack,来成功同时使用wifi+蓝牙+mbedtls同时工作,但是仅剩下23K的RAM可供使用
今天晚些时候我会开始找一下,就算什么应用都不增加导致剩余RAM仅剩下 231KB的原因,这样我就可以在这的基础上做更多的功能啦,再次感谢您

沒問題,加油💪 期待你的好消息!

祝大家端午安康!!!
放假在家花了时间研究了一下RAM的占用,通过查看编译生成的".map"文件,如果我没理解错的话,SDK编译后使用的RAM地址为0x10005000—>0x10032ce0,大约占用了183K的RAM,实际可用的RAM为0x10005000—>0x10079ce0,大约为467K的RAM,即当前剩余可用RAM为284KB那就跟之前测试时仅剩可用231K的RAM不太相符。




开始查找丢失RAM的原因,在“inc_hp/FreeRTOSConfig.h”发现了configTOTAL_HEAP_SIZE的定义


,修改默认配置为250KB为280KB,测试剩余可用的RAM变多了 :grimacing: :smiley:

1 Like

虽然确认了RAM的分布,但实际上可用RAM的大小并没有大幅实际提升,还是担心应用程序不够用 :sweat_smile:

1 Like

哈哈,謝謝反饋!

如果還是擔心RAM不夠的話,可以考慮RTL8721DM/RTL8722DM, 會有2MB的PSRAM,絕對夠用了~

1 Like

暂时不考虑换模块啦,我再想想办法 看能不能从程序上优化优化

1 Like

一定可以的,加油:muscle: :muscle: :muscle: