diff --git a/docs/Getting_started/zh/README.md b/docs/Getting_started/zh/README.md index 54c70c9b2e7b6d28f71ed5a25702dd8b317d04b2..33baf49cacb15b9f2269fd4eb93698ec238ff356 100644 --- a/docs/Getting_started/zh/README.md +++ b/docs/Getting_started/zh/README.md @@ -60,6 +60,8 @@ - [4.8 多线程](./os/threads.md) +- [4.9: 功耗管理](./os/pm.md) +
diff --git a/docs/Getting_started/zh/hardware-basic/README.md b/docs/Getting_started/zh/hardware-basic/README.md index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0b9301ffb63b354baa2ea689b804f29f6fbc5421 100644 --- a/docs/Getting_started/zh/hardware-basic/README.md +++ b/docs/Getting_started/zh/hardware-basic/README.md @@ -0,0 +1,18 @@ +# 5: QuecPython 硬件基础功能 + +本章主要介绍如何使用 QuecPython 的一些硬件基础功能,并附带基于Quecpython开发板的实例演示,具体可展开目录查看。 + +
目录 + +- [5.1: GPIO](./gpio.md) +- [5.2: 外部中断](./extint.md) +- [5.3: 串口](./uart.md) +- [5.4: I2C](./i2c.md) +- [5.5: SPI](./spi.md) +- [5.6: ADC](./adc.md) +- [5.7: Timer](./timer.md) +- [5.8: Pwm](./pwm.md) +- [5.9: 看门狗](./wdt.md) + + 
\ No newline at end of file diff --git a/docs/Getting_started/zh/hardware-basic/timer.md b/docs/Getting_started/zh/hardware-basic/timer.md new file mode 100644 index 0000000000000000000000000000000000000000..45abc773890387b47a7f71df1a61ca42f3e6310c --- /dev/null +++ b/docs/Getting_started/zh/hardware-basic/timer.md @@ -0,0 +1,158 @@ +# Timer - 定时器 + +文档主要介绍如何使用QuecPython\_Timer。 + +## 定时器简介 + +定时器最常用的就是定时与计数,即可以作为精准延时处理,也可以在接通一个时钟源的前提下,统计总共有多少脉冲。通过本文你将了解到machine.Timer和osTimer的所有设置参数及使用方法。 + +### 硬件定时器简介 + +一般由专门的硬件电路来实现,数量和硬件资源相关,设置时写入到期时间,置位使能寄存器即可开始计时,爆发时触发硬件中断,从而执行注册到硬件中断上的回调。 + +### osTimer简介 + +一般由RTOS创建,通过系统tick来计时,数量几乎没有硬性限制,但由于会占用RAM空间,实际上可用数量与RAM大小挂钩。爆发时在RTOS内产生系统中断,从而执行注册到系统中断上的回调。 + +### 硬件描述 + +目前machine.Timer开放共4个定时器,没有硬件定时器的型号底层由RTOS定时器实现,用法保持一致,具体请参阅硬件支持文档进行确认:[硬件支持](https://python.quectel.com/doc/doc/Quecpython_intro/zh/Qp_Product_intro/Hardware_Support.html) + +osTimer统一使用RTOS定时器 + +### 软件设计 + +参阅[machine.Timer相关API介绍](..\..\..\API_reference\zh\QuecPython_classlib\machine.Timer.md)和[osTimer相关API介绍](..\..\..\API_reference\zh\QuecPython_classlib\osTimer.md) + + + +## 定时器功能应用示例 + +### machine.Timer应用示例 + +#### 常量说明 + +| 常量 | 说明 | +|----------------|----------------------------| +| Timer.Timer0 | 定时器0 | +| Timer.Timer1 | 定时器1 | +| Timer.Timer2 | 定时器2 | +| Timer.Timer3 | 定时器3 | +| Timer.ONE_SHOT | 单次模式,定时器只执行一次 | +| Timer.PERIODIC | 周期模式,定时器循环执行 | + +#### 创建Timer对象 + +timer = Timer(Timer)。创建Timer对象接口参数介绍如下: + +| 参数 | 类型 | 说明 | +| ----- | ---- | ---------------------------------------- | +| Timer | int | 定时器号。EC600S支持定时器Timer0\~Timer3 | + +#### 启动定时器 + +timer.start(period, mode, callback):启动对应的定时器,接口参数介绍如下: + +| 参数 | 类型 | 说明 | +|----------|----------|--------------------------------------------------------------------------------------| +| period | int | 中断周期,单位毫秒 | +| mode | int | 运行模式 Timer.ONE_SHOT 单次模式,定时器只执行一次 Timer.PERIODIC 周期模式,循环执行 | +| callback | function | 定时器执行函数 | + +返回值:启动成功返回整型值0,失败返回整型值-1。 + +#### 关闭定时器 + +timer.stop():关闭对应的定时器,无参数。 + +返回值:成功返回整型0,失败返回整型-1 + +#### 交互操作 + +使用QPYcom工具和模组进行交互,下面实例是基于Timer0和Timer1。Timer2和Timer3配置类似。 + + +![](./../media/hardware-basic/Timer/Timer_1.png) + +
+ +注意: + +1. from machine import Timer即为让Timer模块在当前空间可见。 +2. 只有from machine import Timer模块,才能使用Timer内的函数和变量。 +3. 上述操作没有连接任何外设,仅作为熟悉指令参考。 + + + +#### 软件实现 + +配套demo的参考代码为文档同目录下的timer_file.py文件。下载.py文件到模组运行,代码如下: 点击下载代码 + +```python +import log +from machine import Timer +log.basicConfig(level=log.INFO) # 设置日志输出级别 +Timer_Log = log.getLogger("Quectel") # 获取logger对象 +log_print_num = 5 +state = 1 +timer0 = Timer(Timer.Timer1) +# 创建一个执行函数,并将timer实例传入 +def timer_test(t): + global log_print_num + global state + Timer_Log.info('log_print_num is %d' % log_print_num) + log_print_num -= 1 + if log_print_num <= 0: + Timer_Log.info('timer exit') + state = 0 + timer0.stop() # 结束该定时器实例 +timer0.start(period=1000, mode=timer0.PERIODIC, callback=timer_test) # 启动定时器 +while state: + pass + +``` + + + +#### 运行效果 + +1. 打开QPYcom运行timer\_file.py,如下图: + + ![](./../media/hardware-basic/Timer/Timer_2.png) + + +2. 在QPYcom交互界面查看输出结果如下: + + +![](./../media/hardware-basic/Timer/Timer_3.png) + + + +### osTimer应用示例 + +osTimer使用比machine.Timer简单的多,只需要start和stop,代码实现如下: + +```python +import osTimer + +#osTimer回调原型,参数无意义,仅在形式上存在,不使用 +def test_cb(args): + global run_time + run_time = run_time + 1 + print('run_time' + str(run_time)) + if run_time >= 10: + print('timer stop') + timer.stop()#定时器循环10次停止 + +run_time = 0 +timer = osTimer() #创建定时器 +timer.start(1000, 1, test_cb) #第一个参数为时间(单位ms);第二个参数0代表单次执行;1代表循环执行;第三个代表定时器回调 +``` + +执行结果: + +![](./../media/hardware-basic/Timer/Timer_0.png) + +## 总结 + +定时器功能在此做了详细的介绍,如有疑问或更好的建议欢迎联系我们,也可以直接向我们提交文档贡献,后续本文将继续完善和补充更多应用案例。 \ No newline at end of file diff --git a/docs/Getting_started/zh/media/hardware-basic/Timer/Timer_0.png b/docs/Getting_started/zh/media/hardware-basic/Timer/Timer_0.png new file mode 100644 index 0000000000000000000000000000000000000000..19a782d229793bda66346825e2cf4487d45d7999 Binary files /dev/null and b/docs/Getting_started/zh/media/hardware-basic/Timer/Timer_0.png differ diff --git a/docs/Getting_started/zh/media/hardware-basic/Timer/Timer_1.png b/docs/Getting_started/zh/media/hardware-basic/Timer/Timer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f1107ce4581ae3697e2445b68d756ec5c718de96 Binary files /dev/null and b/docs/Getting_started/zh/media/hardware-basic/Timer/Timer_1.png differ diff --git a/docs/Getting_started/zh/media/hardware-basic/Timer/Timer_2.png b/docs/Getting_started/zh/media/hardware-basic/Timer/Timer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..0e188fe252661fb74ec89fb81ae8c0dbddf2108f Binary files /dev/null and b/docs/Getting_started/zh/media/hardware-basic/Timer/Timer_2.png differ diff --git a/docs/Getting_started/zh/media/hardware-basic/Timer/Timer_3.png b/docs/Getting_started/zh/media/hardware-basic/Timer/Timer_3.png new file mode 100644 index 0000000000000000000000000000000000000000..26fc6499fca482baef2dabcf06fd37cc7aa08e9e Binary files /dev/null and b/docs/Getting_started/zh/media/hardware-basic/Timer/Timer_3.png differ diff --git a/docs/Getting_started/zh/media/os/pm/pm_0.png b/docs/Getting_started/zh/media/os/pm/pm_0.png new file mode 100644 index 0000000000000000000000000000000000000000..94492116c9b06597831982899d4a81cf9c44bfa1 Binary files /dev/null and b/docs/Getting_started/zh/media/os/pm/pm_0.png differ diff --git a/docs/Getting_started/zh/media/os/pm/pm_1.png b/docs/Getting_started/zh/media/os/pm/pm_1.png new file mode 100644 index 0000000000000000000000000000000000000000..6ad333c9496cb3946e7b532f2849581984a6f4aa Binary files /dev/null and b/docs/Getting_started/zh/media/os/pm/pm_1.png differ diff --git a/docs/Getting_started/zh/media/os/pm/pm_3.jpg b/docs/Getting_started/zh/media/os/pm/pm_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8418afb3031131ee1b9580a07f7a453633223c6f Binary files /dev/null and b/docs/Getting_started/zh/media/os/pm/pm_3.jpg differ diff --git a/docs/Getting_started/zh/media/os/pm/pm_4.png b/docs/Getting_started/zh/media/os/pm/pm_4.png new file mode 100644 index 0000000000000000000000000000000000000000..6e4c32771ed7f4578a6b0c4cd560eff2eac9d0e8 Binary files /dev/null and b/docs/Getting_started/zh/media/os/pm/pm_4.png differ diff --git a/docs/Getting_started/zh/media/os/pm/pm_5.png b/docs/Getting_started/zh/media/os/pm/pm_5.png new file mode 100644 index 0000000000000000000000000000000000000000..8802d3bd442451dca85b008964e26999464e1388 Binary files /dev/null and b/docs/Getting_started/zh/media/os/pm/pm_5.png differ diff --git a/docs/Getting_started/zh/media/os/power/power_0.jpg b/docs/Getting_started/zh/media/os/power/power_0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3a15cb5f35bcae030fac8e0620ec4574c4c97ddf Binary files /dev/null and b/docs/Getting_started/zh/media/os/power/power_0.jpg differ diff --git a/docs/Getting_started/zh/media/os/power/power_1.jpg b/docs/Getting_started/zh/media/os/power/power_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..29cd5bdd773c4c5fa0d5549b89830d8944b50311 Binary files /dev/null and b/docs/Getting_started/zh/media/os/power/power_1.jpg differ diff --git a/docs/Getting_started/zh/media/os/power/power_2.jpg b/docs/Getting_started/zh/media/os/power/power_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2fe139a641ac8cc9f1157a97537ad42379b8e29 Binary files /dev/null and b/docs/Getting_started/zh/media/os/power/power_2.jpg differ diff --git a/docs/Getting_started/zh/media/os/power/power_3.jpg b/docs/Getting_started/zh/media/os/power/power_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2e094e20089c30194da9e924cf05368cd7451d2 Binary files /dev/null and b/docs/Getting_started/zh/media/os/power/power_3.jpg differ diff --git a/docs/Getting_started/zh/media/os/power/power_4.jpg b/docs/Getting_started/zh/media/os/power/power_4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d63bdfc7926343afbd86484bb24717acc3c6c56a Binary files /dev/null and b/docs/Getting_started/zh/media/os/power/power_4.jpg differ diff --git a/docs/Getting_started/zh/media/os/power/power_5.jpg b/docs/Getting_started/zh/media/os/power/power_5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a62bd8efd65faa6e822bbc078b503c36c4e4543 Binary files /dev/null and b/docs/Getting_started/zh/media/os/power/power_5.jpg differ diff --git a/docs/Getting_started/zh/media/os/power/power_6.jpg b/docs/Getting_started/zh/media/os/power/power_6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6457c5b1d03346bd44d01c131c7c5d4a7a429c8f Binary files /dev/null and b/docs/Getting_started/zh/media/os/power/power_6.jpg differ diff --git a/docs/Getting_started/zh/media/os/power/power_7.jpg b/docs/Getting_started/zh/media/os/power/power_7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a5aa34626d8c0e7038b438d91e0a7835c823edbb Binary files /dev/null and b/docs/Getting_started/zh/media/os/power/power_7.jpg differ diff --git a/docs/Getting_started/zh/os/README.md b/docs/Getting_started/zh/os/README.md index c422c1463ea853286b83539f4962114028edc622..386c3f09d08ad67e62f5f5725acf919cd8984158 100644 --- a/docs/Getting_started/zh/os/README.md +++ b/docs/Getting_started/zh/os/README.md @@ -5,20 +5,14 @@
  目录 -- [4.1: 系统信息]() - -- [4.2: 日志功能]() - -- [4.3: 文件管理]() - -- [4.4: 时间功能]() - -- [4.5: 数据格式转换]() - -- [4.6: 电源管理]() - -- [4.7: 内存管理]() - -- [4.8: 多线程]() +- [4.1: 系统信息](./os-info.md) +- [4.2: 日志功能](./log.md) +- [4.3: 文件管理](./files.md) +- [4.4: 时间功能](./time.md) +- [4.5: 数据格式转换](./data-formattng.md) +- [4.6: 电源管理](./power.md) +- [4.7: 内存管理](./ram.md) +- [4.8: 多线程](./threads.md) +- [4.9: 功耗管理](./pm.md)  
diff --git a/docs/Getting_started/zh/os/pm.md b/docs/Getting_started/zh/os/pm.md new file mode 100644 index 0000000000000000000000000000000000000000..412e96d81586eb35cd381cce278555c417f189ab --- /dev/null +++ b/docs/Getting_started/zh/os/pm.md @@ -0,0 +1,101 @@ +# Pm - 功耗管理 + +本文主要介绍什么是功耗管理、怎么使用功耗管理等相关问题。 + +## 功耗管理简介 + +Quecpython的功耗控制可分为模组功耗和射频功耗两部分。 + +### 射频功耗管理 + +模块的射频工作状态可分为,全功能开启(默认),全功能关闭,飞行模式。 + +```py +# 获取工作模式 +import net +net.getModemFun() + +# 设置飞行模式 +net.setModemFun(4) +``` + +注意:开启飞行模式时,射频将会被关闭,此时模块处于断网阶段,无法进行任何网络通信。 + +全功能和飞行模式的功耗对比: + + + + + +### 模组功耗管理 + +#### Cat1的PM + +在Quecpython中,低功耗的配置是基于锁的,即有锁则不休眠,无锁则自动休眠。此方法在使用过程中常用于锁住业务,当业务执行时,对锁进行上锁操作,防止芯片进入休眠状态,当业务结束后对锁进行解锁操作,通知底层用户业务已结束,可以调度休眠以降低功耗。 + +#### NBIOT的PM + +因为NBIOT网络结构的特殊性,所以NB模块的休眠设置会更加繁琐一些,NBIOT的休眠寻呼模式有三种,分别是PSM EDRX DRX,三者的功耗是上升排列,Quecpython目前支持PSM模式的休眠控制,即用户只需要去设置PSM相关定时器就可以完成模块的在网休眠。 + +PSM模式休眠有两个休眠控制定时器需要用户来配置,一个是TAU(T3412),另一个是ACT(T3324),ACT是终端在idle态的超时时间,TAU是终端在PSM态的超时时间,当TAU超时后,终端将进入connect态进行联网寻呼。 + +### 硬件设计 +串口、外部中断、SPI、I2C等外设均处于空闲状态,才能进入低功耗 + +### 软件设计 + +接口可参考[pm功能API说明文档](..\..\..\API_reference\zh\QuecPython_classlib\pm.md). + +定时器不触发、线程全部处于IDEL、功耗锁全部释放,才能进入低功耗 + +## 模组功耗管理功能应用实例 + +在本文中,我们将使用 QuecPython 开发板,演示低功耗功能。 + +### 准备工作 + +Quecpython开发板,功耗仪 + +### 代码实现 + +```python +import pm +import utime + +# 创建wakelock锁 +lpm_fd = pm.create_wakelock("test_lock", len("test_lock")) +# 设置自动休眠模式 +pm.autosleep(1) + +# 模拟测试,通过功耗锁每20S切换一次休眠/非休眠状态,实际开发请根据业务场景选择使用 +while 1: + utime.sleep(20) # 休眠20S + res = pm.wakelock_lock(lpm_fd) #加锁唤醒 + print("ql_lpm_idlelock_lock, g_c1_axi_fd = %d" %lpm_fd) + utime.sleep(20) # 唤醒20S + res = pm.wakelock_unlock(lpm_fd) #解锁,再次进入休眠 + print(res) + print("ql_lpm_idlelock_unlock, g_c1_axi_fd = %d" %lpm_fd) + num = pm.get_wakelock_num() # 获取已创建锁的数量,此数目大于0时无法进入休眠 + print(num) +``` + +### 功耗测试 + + + +如上图,使用功耗仪由5V电源供电,断开USB,运行以上脚本,可比较休眠和非休眠状态下的功耗 + +功耗如下: + + + + + +可见,耗流会有明显下降(一般在10mA以上) + +注意,本例测试的是Quecpython开发板的整体功耗,只是对比休眠/非休眠模式下同种硬件的耗流水准,不能反映模组的真实功耗。模组的实际功耗水平请参阅对应的硬件设计手册。 + +## 总结 + +功耗管理功能在此做了详细的介绍,如有疑问或更好的建议欢迎联系我们,也可以直接向我们提交文档贡献,后续本文将继续完善和补充更多应用案例。 \ No newline at end of file diff --git a/docs/Getting_started/zh/os/power.md b/docs/Getting_started/zh/os/power.md index a64aa486e6407728cbf320d0382352fc5607665f..e5e21d0eeeb9f651dbc5a35691056b4d6a6624d2 100644 --- a/docs/Getting_started/zh/os/power.md +++ b/docs/Getting_started/zh/os/power.md @@ -1,35 +1,114 @@ -# 电源管理 +# Power - 电源管理 +本文主要介绍电源管理功能的使用 +## 电源管理简介 -Quecpython的电源管理分为NET控制和PM控制两部分。 +### 什么是电源管理 -## 工作模式切换 +电源管理是模组本身控制电源状态的功能集合,包括一系列硬件外设和软件接口。藉由这些硬、软件,我们可以实现对模组电源状态的控制和查询。 -模块的工作状态可分为,全功能开启(默认),全功能关闭,飞行模式。 +### 怎么使用电源管理 -```py -# 获取工作模式 -import net -net.getModemFun() +电源管理功能一般由模组的PMIC(或称PMU,电源管理单元)实现,此单元对于模组是不可或缺的存在,其软件接口可在[misc.Power功能API文档](..\..\..\API_reference\zh\QuecPython_classlib\misc.Power.md)中查阅,硬件则需要参阅对应模块的硬件设计文档。 -# 设置飞行模式 -net.setModemFun(4) +### 硬件设计 + +电源管理设计的硬件主要是Powekey和Reset引脚(部分平台会有额外的功能引脚)根据模组的硬件设计文档(从 [下载区](/download/) 获取)设计好硬件电路即可。设计硬件电路时,注意严格遵循硬件设计文档内的设计规范,防止硬件问题造成模组电源状态异常,这种问题往往是软件难以补救的。 + +不同平台的模组PMIC功能会有差别,软件接口都做了统一处理,其使用方法如下。 + +### 软件应用 + +当使用电源管理功能时: + +```python +>>>from misc import Power +>>>Power.powerDown()#软关机 +>>>Power.powerRestart()#软重启 +>>>Power.powerOnReason()#查询开机原因 +>>>Power.powerDownReason()#查询关机原因 +>>>Power.getVbatt()#查询当前模组Vbat引脚电压,单位为mV(毫伏) +``` + +### 电源管理功能测试 + +在命令行中可通过调用以上关机/重启接口,观察模组实际电源状态是否和接口对应功能一致。获取开关机原因可以与最近一次开关机时的状态相对照。Vbat引脚电压可以使用电压表实际测试Vbat引脚电压,与接口获取到的值比较。 + +## Power功能应用实例 + +在本文中,我们将使用 QuecPython 板载的PowerKey&Reset,实现上述测试项目,并模拟上电开机的硬件解决方案。 + +### 准备工作 + +我们需要使用 QuecPython 开发板、电压表或万用表一个、杜邦线或跳线帽若干、5V直流电源一个。开发板上需用到的器件如下图: + + + +### 代码实现 + +以下是输出开关机原因的 QuecPython 代码。代码中的注释将帮助您理解代码的工作原理。 + +```python +# 导入所需模块 +from misc import Power + +#打印本次开机原因 +print("本次开机原因:{0}\r\n".format(Power.powerOnReason())) +#打印上次关机原因 +print("上次关机原因:{0}\r\n".format(Power.powerDownReason())) ``` -注意:开启飞行模式时,射频将会被关闭,此时模块处于断网阶段,无法进行任何网络通信。 +这段代码通过使用 `misc` 模块来输出开关机原因,我们以此段代码,来测试控制电源状态的软/硬件接口。 + +### 实例测试 + +测试1:接通电源(开发板供电位置如下),打开DC电源开关,按下开关,待模组启动后打开交互口,运行以上代码 + + + +结果如下: + + + +此时可见,开机原因为1,代表powerkey开机,关机原因为3,代表上次是掉电关机(具体原因可从[misc.Power功能API文档](..\..\..\API_reference\zh\QuecPython_classlib\misc.Power.md)中查询)。 + +测试2:按下Reset,待模组启动后打开交互口,运行以上代码 + + + +此时可见,开机原因为重启,关机原因则不在列表内。 + +测试3:运行软重启,待模组启动后打开交互口,运行以上代码 + + + +此时可见,开机原因为重启,关机原因为正常关机。 + +测试4:运行软关机,然后通过powerkey开机,待模组启动后打开交互口,运行以上代码 + + + +此时可见,开机原因为powerkey,关机原因为正常关机。 + +测试5:长按Powerkey关机,然后通过powerkey开机,待模组启动后打开交互口,运行以上代码 + + +此时可见,开机原因为powerkey,关机原因为正常关机。 +测试6:上电自启动的硬件构型 -## 低功耗控制 +关闭电源,将powerkey按钮右侧的两个通孔短接,然后上电,可以观察到模组自启动,启动原因为powerkey -### Cat1的PM + -在Quecpython中,低功耗的配置是基于锁的,即有锁则不休眠,无锁则自动休眠。此方法在使用过程中常用于锁住业务,当业务执行时,对锁进行上锁操作,防止芯片进入休眠状态,当业务结束后对锁进行解锁操作,通知底层用户业务已结束,可以调度休眠以降低功耗。 +测试7:读取VBAT电压,在VBAT测试点上测试模组电压 -调用示例可参考API Reference. + -### NBIOT的PM + -因为NBIOT网络结构的特殊性,所以NB模块的休眠设置会更加繁琐一些,NBIOT的休眠寻呼模式有三种,分别是PSM EDRX DRX,三者的功耗是上升排列,Quecpython目前支持PSM模式的休眠控制,即用户只需要去设置PSM相关定时器就可以完成模块的在网休眠。 +会略有一些误差,可在软件上做补偿 -PSM模式休眠有两个休眠控制定时器需要用户来配置,一个是TAU(T3412),另一个是ACT(T3324),ACT是终端在idle态的超时时间,TAU是终端在PSM态的超时时间,当TAU超时后,终端将进入connect态进行联网寻呼。 +## 总结 +电源管理功能在此做了详细的介绍,如有疑问或更好的建议欢迎联系我们,也可以直接向我们提交文档贡献,后续本文将继续完善和补充更多应用案例。 \ No newline at end of file diff --git a/docs/Getting_started/zh/os/ram.md b/docs/Getting_started/zh/os/ram.md new file mode 100644 index 0000000000000000000000000000000000000000..87e253266e2e1fa3984d5da6125ab09cc297e118 --- /dev/null +++ b/docs/Getting_started/zh/os/ram.md @@ -0,0 +1,61 @@ +# Ram - 内存管理 + +本文主要介绍什么是内存管理、怎么使用内存管理等相关问题。 + +## 内存管理简介 + +Quecpython的内存可分为模组heap和python虚拟机gc两部分。 + +### heap管理 + +heap是模组本身的堆空间,heap不足时往往会引发模组死机,我们并不能直接控制它的使用和释放。但我们可以通过_thread中的接口监控其余量,亦可控制python创建线程时申请的栈空间。 + +### GC内存管理 + +GC是模组在启动时分配给python虚拟机的内存,python运行时的对象都存储在这个空间中。GC默认会在用完时触发GC回收,我们可以监控GC使用情况、开关自动回收、调整自动回收阈值,以及手动进行gc回收。 + + + +### 软件设计 + +接口可参考[_thread功能API说明文档](..\..\..\API_reference\zh\QuecPython_stdilb\_thread.md)和[GC功能API说明文档](..\..\..\API_reference\zh\QuecPython_stdilb\gc.md). + +## 内存管理功能应用实例 + +在本文中,我们将使用 QuecPython 开发板,演示GC功能。 + +### 准备工作 + +Quecpython开发板 + +### 代码实现 + +```python +#heap管理 +>>> import _thread +>>> _thread.get_heap_size() #获取剩余heap,单位byte +2199424 +>>> _thread.stack_size(8192) #设置python创建线程时申请的栈空间 +0 +#gc管理 +>>> import gc +>>> gc.mem_free() #获取剩余gc,单位byte +493760 +>>> gc.mem_alloc() #获取已申请gc,单位byte +18576 +>>> gc.disable() #关闭gc自动回收 +>>> gc.isenabled() #查询gc自动回收状态,已关闭 +False +>>> gc.enable() #打开gc自动回收 +>>> gc.isenabled() #查询gc自动回收状态,已打开 +True +>>> gc.threshold(int(512*1024*0.75)) #设置gc自动回收阈值,参数整型,单位byte,gc使用量达到参数值时触发gc回收,可由总量乘百分比得到 + +>>> gc.collect() #手动触发gc回收 +>>> gc.mem_free() #已经不再使用(所属对象引用计数器被置零)的gc内存被回收,gc总量回升 +506928 +``` + +## 总结 + +内存管理功能在此做了详细的介绍,如有疑问或更好的建议欢迎联系我们,也可以直接向我们提交文档贡献,后续本文将继续完善和补充更多应用案例。 \ No newline at end of file diff --git a/docs/Getting_started/zh/sidebar.yaml b/docs/Getting_started/zh/sidebar.yaml index e9fe7a19d3ea5e9b0c33d59abf2146e1d3a55365..35ded8b2c9064f90fb6a9b7be75c4205b8355794 100644 --- a/docs/Getting_started/zh/sidebar.yaml +++ b/docs/Getting_started/zh/sidebar.yaml @@ -56,6 +56,8 @@ items: file: os/ram.md - label: "4.8 多线程" file: os/threads.md + - label: "4.9 功耗管理" + file: os/pm.md - label: "5 QuecPython 硬件基础功能" file: hardware-basic/README.md