问题标签 [micropython]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - 如何在 Micropython 汇编语言中测试浮点寄存器的符号
我正在学习 MicroPython 的汇编程序(PyBoard 的 ARM Thumb2 指令集)。
有没有比这更快的方法来检查 FPU 寄存器(s0)的符号(正/负)?
这可行,但它似乎不是“正确”的解决方案(不确定 的符号r2
总是与 的符号匹配s0
),我怀疑它必须在少于两个指令中是可能的。
更新 1:
根据评论(谢谢),我进一步提高了代码的速度:
但它仍然留下一个问题,这是确定 FP 值符号的可靠方法吗?
以下是我系统上四个浮点值的字节表示形式供参考:
我想如果这取决于硬件,那么我不应该依赖它来确定标志......
我认为这可能是“正确”的做法(即正确的 FPU 比较):
但我对此进行了计时,它比上面的代码慢了 11% ( float_array_abs1
)。因此,如果它是一个可靠的解决方案,那么使用早期的代码会很好。
更新 2:
@Ped7g 提出了该方法and 0x7FFFFFFF
(见评论)。
我对此进行了测试,它确实有效。这是代码:
更正:它比float_array_abs1
上面更快。这似乎是最好的解决方案,但它是否强大?
micropython - Micropython - 正则表达式
我有以下字符串:['', '+VZWRSRP: 64,6300,-101.70', '', 'OK', '']
我尝试将第二个逗号之后的所有内容放入变量 PCI,第三个逗号之后的所有内容放入变量 earfcn,第四个逗号之后的所有内容放入变量 RSRP。
一开始我想用 RSRP 和下面的正则表达式命令来测试它:
但不知何故,我无法让它工作。
什么是实现这一目标的好解决方案?
esp8266 - ESP8266 上的 MicroPython - RTC 没有初始化方法?
文档说可以使用 RTC.init 调用来初始化 RTC 时钟。
https://docs.micropython.org/en/latest/esp8266/library/machine.RTC.html
但它不是那样工作的:
因此,文档与现实相矛盾。固件版本为 v1.9.3 - 几天前下载的最新版本。
最有趣的是,dir(rtc)
给出['datetime','memory','alarm','alarm_left','irq','ALARM0']
. 它缺少其他几种方法:now、deinit、cancel
那么RTC的init方法在哪里呢,怎么会消失呢?
更新:我发现文档是错误的,我需要使用RTC.datetime
而不是RTC.init
. 但这仍然是错误的:
换句话说:2000-01-01T23:59:59 突然变成了 2000-01-03T00:11:59。如何?
我在 RTC.datetime 方法的 tzinfo 参数上也找不到任何有用的东西。它应该是一个数字,这很清楚。但是这是什么意思?
我也试过午夜:
所以在 tzinfo=0 时,午夜变为 05:00:00。我首先认为这意味着 UTC+5 但它不是:
最后:
疯了吧!看起来小时部分完全被忽略了。
nodemcu - 在 MicroPython 的不同文件中创建类
我正在尝试将 MPU6050 模块用于 NodeMCU 中的 MicroPython,使用 uPyCraft 作为编辑器。(https://github.com/larsks/py-mpu6050/blob/master/mpu6050.py)
我遇到了一些麻烦,我试图简化代码,以至于我只是尝试调用在不同文件中定义的类,但我无法让它工作。这是我到目前为止所做的:
我创建了一个新文件(myFile.py),它看起来像:
然后在我的 main.py 我做:
我运行main.py
并在执行行时收到此错误myclass = myFile.myClass()
:
“模块”没有方法 myClass
我没有使用 MicroPython 的经验(尽管我是 C# 编码器),所以我很确定我缺少一些关于语法的细节。有什么帮助吗?
这里有一些测试(文件名是真实的,我在问题中简化了):
其他:
然后在运行时:
scheduler - ESP8266 Micropython 调度器
我正在寻找一种简单的方法来安排每天重启我的 ESP8266,目前在 Micropython 上运行。我做了相当多的研究,但没有找到任何我可以使用/理解的东西。我想知道这是否需要通过 Micropython 或其他系统语言来完成。在最坏的情况下,我将创建一个无限循环来检查一天中的时间,但这似乎非常极端,并不是对 RAM 的最佳使用。重新启动背后的原因是控制器将长时间无人看管,我需要每天重置它以防它崩溃,所以我不会超过 24 小时没有它当前提供的数据。
我看过uasyncio,但不明白。
sockets - 在 Python 中发送 REST GET 时如何设置客户端的端口?
我有一些非常基本的网络相关问题:
- 在 Python 请求库中,如果我想进行 REST GET 调用,我知道内部会创建一个套接字来发送和接收 GET 请求和响应。至于创建套接字的端口,我理解它在自由范围内是随机的,如果我错了,请纠正。
- 如果我想在客户端上进行这样的 REST GET 调用,使用特定的端口,是否可以这样做?
虽然 2 似乎是一个奇怪的要求,但我确实有一个用例。所以请让我知道这是否可能。
编辑1:
如果我可以扩展 8266 的第二个问题,是否可以在 Micropython 中从 8266 发送 REST GET 数据包时指定客户端端口?
python - USB 在固件闪存工具中可见,但在 Visual Studio Code 中不可见
我正在使用 MicroPython 扩展,并已通过串行 COM 端口使用 NodeMCU flasher 工具将 MicroPython 固件(操作系统)成功刷入到 ESP8266 目标设备。
通过选择项目文件夹创建新项目后,我被告知 COM 端口的自动检测不适用于 Windows 版本的 Visual Studio Code。系统提示我手动输入已将目标 MicroPython 设备连接到的 COM 端口,然后 VSC 会说:
Port not exist, please connect device and try again!
我尝试了所有 4 个 USB 端口,重新安装了驱动程序软件,重新启动计算机,重新启动目标设备并确保目标设备处于程序闪存模式(以允许将应用程序写入其中)每次我尝试连接VSC给它!
esp8266 - ESP 8266 MicroPython 获取 POST 的部分数据
我正在尝试在 ESP8266-01(1MB 闪存)上设置一个简单的 HTTP Web 服务器,它具有最新的 1.9.3 MicroPython 固件。目的是能够配置家庭网络的凭据,STA 接口最终将连接到该网络。
所以高级代码是这样做的:
- 打开AP接口
- 有人会连接到
192.168.0.1/index.html
,它会有一个用户名和密码表单。我们只需要输入管理员/管理员。点击提交按钮应该做一个 POST 到192.168.0.1/configure.html
Configure.html
是一个带有表单的网页,其中将输入 SSID 和密码。我希望您可以通过查看下面的代码来了解更多详细信息
我面临两个问题:
- 提交表单时收到的总字节数
index.html
不完整。我找到了推荐人(太偏了),总共大约 560 个字节。这是我从移动浏览器执行此操作的时间。有趣的是,它总是得到那么多字节。如果这会有所帮助,我可以分享我得到的东西。 - 看门狗计时器有时会重新启动我的模块。我正在我的代码中进行大部分建议的更改 - 使用小睡眠。在 ESP8266 上的 MicroPython 中是否有任何方法,通过它我可以“馈送”WDT,使其不会“超时”并重新启动我的模块?
以下是我的代码:
编辑1:
我能够设置 WDT 并提供它。所以没有更多的 WDT 重新启动。但是,POST问题仍然存在:
仅供参考,以下是响应:
可以看出,接收到的数据包是部分的,Content-Length 标头表示 43 字节有效负载。但它没有收到。当使用“nc”并在本地运行服务器时,收到的数据包如下:
在这里,可以很容易地看到 43 字节长度的有效负载。
所以我的问题是,对于 ESP8266 来说,几乎 800 字节的有效负载是否太多?有什么办法可以删除浏览器发送的不必要的标头?如果数据碎片化,有什么方法可以获取所有数据?
python - Micro:bit 类而不是全局变量 - micropython 中的内存分配错误
我刚刚在 Micro:bit 上为高中/高中编码俱乐部创建了我的第一个小真相或敢于/旋转瓶游戏。我想介绍使用 oop/classes/objects 而不是(可怕的)全局变量。该游戏在https://create.withcode.uk/等模拟器上运行良好,但在 Micro:bit 本身上,当我尝试将几乎所有内容放入类时,我就会遇到内存分配错误。microbit的16KB RAM不够用吗?还是我错误地声明了课程?
来自前端和一点 PHP/SQL,我是 Python/内存知识的菜鸟,因此感谢您的帮助。
如果我在每个函数中使用全局变量,它就可以正常工作。
这是代码:
python - 垃圾收集 - 标记+扫描是否必须是整体/原子的
本次讨论将使用micropython代码,但由于它是如此简单,我希望它对mark+sweep的一般讨论有所帮助
Micropython使用垃圾收集,特别是标记和清除;让我们定义一下。
标记
在标记阶段,gc
跟随内存引用并逐字标记使用的内存块,以指示它们可以从根块集合中访问。
Sweep
标记阶段完成后,sweep 循环遍历整个堆,如果内存块被使用但未标记,则意味着代码无法访问它,因此它被“释放”,即标记为free。在标记阶段标记的内存块已删除该标记。
当前的实现需要一个原子调用来执行垃圾收集,gc
但我一直想知道是否可以将其拆分为多个调用,而不是一个整体/原子调用。
这将有助于减少抖动:而不是一个大的时间命中,你会有一堆较小的调用分散。(这里不讨论如何“展开”gc
调用的实现细节......除非有人认为它会增加讨论。)
如果gc
“在后台”运行——在字节码之间或在预定义字节码之后——那么在错误点的分配(或解除分配)可能会导致竞争条件和堆损坏。在我们可以拆分gc
执行之前,我们必须确定可能的竞争条件。
可以执行的两个操作是:分配和解除分配。
分配
如果用户在标记或扫描阶段的中间执行分配会发生什么?
我们来看一个具体的代码示例
标记期间的分配 在
上面的示例中,在 REPL 中执行了一条语句,因此对字典的任何添加都将添加到全局字典中,该字典是GC Roots
. 如果在扫描之前将条目添加到全局变量中,则不会发生任何“坏事”:新的内存块将被标记为应有的状态。
问题是如果全局变量在扫描后被修改。在这种情况下,内存块不会被标记,因此在扫描阶段,它将被视为“无法访问”并被释放。. . 即使它不应该。
扫描期间的分配 如果在扫描
程序遍历内存中的该点之前分配了一个块,它将释放它,因为它没有标记阶段的特殊标记。如果在清扫器遍历所述块之后分配块,则不会发生任何不好的事情。
解决方案
如果gc
正在执行,则将分配的块标记为标记。唯一的缺点是,如果您在相位扫描中分配并且在扫描器检查了新分配的块之后,您将完成gc
一个带有标记的块mark。gc
除非用户明确释放它,否则如果它变得无法访问,您将需要通过一个额外的周期来释放它。
但是有一个简单的解决方案:如果在相位扫描期间分配,则检查扫描器的位置:如果要分配的新块在其后面,则不要标记它,否则,标记它有一个标记,因为清扫车会删除一个标记。这样您就不会退出gc
带有标记的块mark。
重新分配
如果用户在标记或扫描阶段的中间执行分配会发生什么?
标记期间的释放
如果在扫描引用(父)块之前释放块,则不会发生任何事情。
如果一个块被释放并且它的子节点已经被标记,我们就会出现不一致,因为只有当块的父节点也被标记(或者父节点是 a )时,才应该标记块。结果是这些无法到达但被标记的块直到一个额外的循环才会被释放,因为已经被标记,这些无父但被标记的块将不会被阶段扫描释放。GC root
gc
但是,我认为这不是问题,因为这与单片机的情况没有任何不同gc
。在单片机gc
中,您必须完成当前gc
循环,然后用户会调用free(ptr)
,然后该块的子代将在 next 期间被释放gc
。直到堆处于“正确”状态的时间量不会改变。
扫描期间的释放
如果一个块在清扫器检查之前被释放,没有什么特别的事情发生。自由操作将目标块的状态从标记变为自由,然后当清扫车到达它时。. . 这里没什么可看的,只是一个空闲块。
如果一个块在清扫器检查后被释放,则释放操作会将目标块的状态从used更改为free。
问题
我的分析是否正确:是否可以拆分标记+清扫垃圾收集?