QuecPython编程注意事项
创建的实例对象能定义成全局变量的不要定义成局部变量,否则可能会因为局部变量被系统回收导致出现异常,如:GPIO状态恢复 到默认状态导致的异常,对象被回收导致找不到的异常等。
多线程编程时,建议在主线程中对其他子线程进行监控,避免其他子线程出现异常情况停止工作等情况导致工作异常。
只要有死循环的操作或者循环次数特别多这类占用CPU时间较长的操作,死循环中都必须加一个utime.sleep(),可以是sleep_ms或者sleep_us。
代码逻辑里使用utime.sleep延时进行计时操作会发现时间有偏差问题。此延时时间不是精准的延时,精准的延时需要使用定时器,并且毫秒级延时和微秒级延时接口更不准确,不能用来做时序操作。ASR
的ostick是5ms,CAT M的是10ms,展锐是20ms,小于就靠任务切换了,随机值。
QuecPython 的 I2C 接口地址会自己添加读写位,传入 7 位地址即可,填入8位地址会导致无法通信。
在不影响业务逻辑的情况下尽可能在main.py开头延时个5-10S,给各部分资源充分的时间就绪。
MQTT断线通过捕获异常获取,但是断线后,异常捕获不到:会抛出异常,umqtt已经做了处理,上层的try捕捉不到下面的异常,对于断线后会尝试重连,有log输出,不会直接抛出异常。
执行网络通信相关业务逻辑前务必确保网络畅通,或做好异常捕获(逻辑上一定要考虑全),例如网络异常时进行socket连接报错的异常处理等。
现版本(2022.07.15)以及之前版本app_fota功能存在的极小概率出现的bug需要python代码层先进行规避。小概率出现某个文件下载失败会一直下载失败导致升级不成功问题,把下载失败的文件删除再进行下载升级。
尽量少写文件系统,读写文件系统过多是对flash寿命的消耗,同时在遇到读写文件系统时遇到异常断电等情况时文件内容可能会出现丢失或异常。会写FLASH的
API:文件操作、net.setapn(会判同)、dataCAll.setapn、system.setRelEnable(会判同)、fota、appfota、sms存储。使用AT的方式暂不能确定。
尽量少使用锁,能消息队列尽量消息队列。
如果有按键,硬件上要做防抖。
软狗机制:为了防止系统陷入某种非正常的死循环导致不能正常工作,可以使用软件看门狗进行守护,若超过时间不能喂狗,狗线程自动重启设备。局限性或缺点:需要初始化;如果程序在初始化、启动完成前跑飞或在禁用后跑飞,看门狗就无法复位系统,这样看门狗的作用就没有了,系统恢复能力降低。
双核通信异常处理机制:校验重传。对于有外部mcu的场景,在通信时应做好数据有效检验和重传机制,避免由于干扰带来数据错误时无法继续通信。
gc内存可以自动回收,也可以手动触发回收,自动回收是在内存申请失败的时候自动触发,此时可能会带来内存碎片,如果申请大内存的话可能失败。手动回收可以定时做,但一定不能频繁(参考标准10S以上)。
回调是线程执行的,所有的线程都竞争同一把gil锁,所以为了保证回调的及时性,所有线程都不能有长时间占用cpu的行为。
文件seek时必须确保目标写入指针到文件末尾的 size必须小于文件系统的剩余空间。
每个平台可以使用的堆栈大小。展锐:heap分配5227KB,开机heap剩余约3039K,创建线程支持最大的栈size 65535字节。ASR:heap分配2899KB,开机heap剩余约958K,创建线程支持最大的栈size 代码中未设置上限。CAT M:heap分配800KB,开机heap剩余约658K,创建线程支持最大的栈size 代码中未设置上限。