在程序的makefile中,必须编写定义每个目标文件的依赖关系的规则.考虑目标文件fileA.o.很明显,此目标文件取决于源文件fileA.c.但它也将取决于此源文件包含的所有头文件.因此,应将以下规则添加到makefile中:
# This rule states that fileA.o depends on fileA.c (obviously), but also
# on the header files fileA.h, fileB.h and fileC.h
fileA.o: fileA.c fileA.h fileB.h fileC.h
Run Code Online (Sandbox Code Playgroud)
请注意,该规则没有配方.可以添加一个配方,但严格来说并不是必需的,因为GNU make可以依赖一个隐式规则(带配方)将*.c文件编译成*.o文件.
无论如何,手动编写这样的规则是一项地狱般的任务.想象一下使makefile规则与源代码中的#include语句保持同步的工作.
GNU make手册在第4.14章"自动生成先决条件"中描述了一种自动执行此过程的方法.该过程从*.d为每个源文件生成文件开始.我引用:
对于每个源文件name.c,都有一个makefile name.d,它列出了目标文件name.o所依赖的文件.
手册进行:
这里是规则图案产生的前提条件的文件(即,生成文件)称为name.d从称为C源文件name.c:
%.d: %.c
@set -e; rm -f $@; \
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; …Run Code Online (Sandbox Code Playgroud) 我使用“Exhuberant ctags”来索引我的 c 项目中的所有标签。c-project 是 Cortex-M7 微控制器的嵌入式软件。结果是一个标签文件。我正在尝试阅读该文件并理解所写的内容。
根据我找到的 ctags 和 Exhuberant ctags 的文档,我可以掌握大多数行的含义。例如:
ADC3 .\Drivers\CMSIS\Device\ST\STM32F7xx\Include\stm32f767xx.h 1525;" d
Run Code Online (Sandbox Code Playgroud)
这行的意思是:
ADC3。.\Drivers\CMSIS\Device\ST\STM32F7xx\Include\stm32f767xx.h。1525该文件中的行。d- 这是一个“宏定义”。到目前为止,一切都很好。但是标签文件中有很多行我无法理解。例如:
A0 .\Drivers\CMSIS\Include\arm_math.h /^ q15_t A0; \/**< The derived gain, A0 = Kp + Ki + Kd . *\/$/;" m struct:__anon68
Run Code Online (Sandbox Code Playgroud)
和这个:
ABFSR .\Drivers\CMSIS\Include\core_cm7.h /^ __IOM uint32_t ABFSR; \/*!< Offset: 0x2A8 (R\/W) Auxiliary Bus Fault Status Register *\/$/;" m struct:__anon187
Run Code Online (Sandbox Code Playgroud)
和这个:
ABR .\Drivers\CMSIS\Device\ST\STM32F7xx\Include\stm32f767xx.h /^ __IO uint32_t ABR; …Run Code Online (Sandbox Code Playgroud) 我找到了一种优雅的方法来装饰Python类来实现它singleton.该类只能生成一个对象.每次Instance()调用都返回相同的对象:
class Singleton:
"""
A non-thread-safe helper class to ease implementing singletons.
This should be used as a decorator -- not a metaclass -- to the
class that should be a singleton.
The decorated class can define one `__init__` function that
takes only the `self` argument. Also, the decorated class cannot be
inherited from. Other than that, there are no restrictions that apply
to the decorated class.
To get the singleton instance, use the …Run Code Online (Sandbox Code Playgroud) 阅读帖子https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide 后,我想我掌握了class attributes和之间的区别instance attributes。但是仍然有一个我无法解释的奇怪现象:pyqtSignal()PyQt 中的行为。
我了解到类属性存在于类的命名空间中。如果您访问这样的变量——例如class_var——通过一个实例,Python 将首先查看该实例的命名空间。在那里找不到它,Python 会查看类的命名空间。
让我们看一个类属性,它是一个简单的整数。您应该通过类本身访问它,但您也可以通过其实例之一来访问它:
class MyClass(object):
class_var = 1
def __init__(self):
pass
if __name__ == '__main__':
obj_01 = MyClass()
obj_02 = MyClass()
# Access the 'class_var' attribute
print("obj_01.class_var -> " + str(obj_01.class_var)) # prints 1
print("obj_02.class_var -> " + str(obj_02.class_var)) # prints 1
print("MyClass.class_var -> " + str(MyClass.class_var)) # prints 1
Run Code Online (Sandbox Code Playgroud)
但是,如果您class_var通过实例分配一个新值,您实际上创建了一个在该特定实例的命名空间中命名的新属性class_var。实际的类变量保持不变:
obj_01.class_var = 3
print("obj_01.class_var …Run Code Online (Sandbox Code Playgroud) 我正在使用PyQt5 for GUI 在Python 3.7中创建一个应用程序。我想在应用程序中自定义鼠标光标。
让我们从Qt5中设置的标准光标开始,如下表所示:https :
//doc.qt.io/qt-5/qt.html#CursorShape-enum。您会注意到Qt5有一个专用的Enum,它Qt::CursorShape描述了相应游标的作用。例如:
我想用自定义光标替换每个标准Qt光标:
一开始我尝试过这样的事情:
pixmap = QPixmap("C:/../my_arrow.png")
cursor = QCursor(pixmap, 32, 32)
QApplication.setOverrideCursor(cursor)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种方法对我的目的不利。从文档中:
应用程序覆盖游标旨在向用户显示应用程序处于特殊状态,例如在可能需要一段时间的操作期间。
覆盖光标将显示在应用程序的所有小部件中,直到调用restoreOverrideCursor()或另一个setOverrideCursor()。
换句话说,使用该setOverrideCursor()方法有两个缺点:
我将不得不手动跟踪鼠标指针应更改为哪个角色,setOverrideCursor()每次都调用并向其提供适当的QCursor()。
我需要跟踪Qt自动调用的位置restoreOverrideCursor(),因为这实际上会撤消我自己的更改。与Qt的斗争将是永恒的。
我的第二种方法是使用该setCursor()函数:
pixmap = QPixmap("C:/../Arrow.png")
cursor = QCursor(pixmap, 32, 32)
my_widget.setCursor(cursor)
Run Code Online (Sandbox Code Playgroud)
我在顶级窗口小部件-上执行此操作,QMainWindow()以便将效果应用于整个应用程序。
它的效果很好,但有一个缺点。此功能仅更改“默认光标”(指向箭头),仅此而已。所有特殊光标仍然相同。
实际上,我想做这样的事情:
# Note: 'mainwin' is the QMainWindow().
mainwin.setCursor( …Run Code Online (Sandbox Code Playgroud) 我正在尝试将OpenOCD用于不常见的事情。除了连接芯片,我只想检测芯片。
我想到的过程将如下所示:
使用参数作为探针的配置文件(例如
stlink.cfg)启动OpenOCD-f。因此,OpenOCD知道要使用哪种探针,但不知道它将找到哪种芯片。OpenOCD检测到芯片并以某种方式报告该错误(例如,向stdout写一些东西)。如果可能的话,此操作不应对芯片造成干扰(例如将其重置)。
OpenOCD关闭。
以下是有关该过程的更多说明:
注意1:如果OpenOCD没有达到服务器状态(我需要设置Telnet或GDB客户端才能与其进行交互),那将是很好的。我很乐意以更方便的方式获得芯片检测报告,例如在stdout通道上获取芯片信息。
注2:检测不应对芯片造成干扰。但是,如果OpenOCD找不到任何东西,我希望有一种备份方法,其中OpenOCD尝试更积极地查找芯片(例如按住nRST销)。如果需要,我可以自己调用其他方法(因此,无需OpenOCD自动执行此操作)。
注意3:首先,我将仅在具有STLinkV2或STLinkV3探针的STM32芯片上应用此“芯片检测”功能,然后再将其应用于其他探针和芯片。
注4:某些板仅具有SWD连接(无JTAG)。
注意5:我正在Windows 10计算机上工作,并从https://www.playembedded.org/blog/download/下载了最新的OpenOCD版本(版本0.10.0_dev00921,于2019年7月6日构建)。
Tommy Murphy先生向我介绍了OpenOCD参考手册中的10.7节(请参阅http://openocd.org/doc/pdf/openocd.pdf)。我已经阅读了本节,并观察了以下示例:
# openocd.cfg file
# -----------------
source [find interface/olimex-arm-usb-tiny-h.cfg]
reset_config trst_and_srst
jtag_rclk 8
Run Code Online (Sandbox Code Playgroud)
因为我的芯片通过STLink探针连接并且使用SWD传输协议(而不是JTAG),所以我对该示例进行了一些修改:
# openocd.cfg file
# -----------------
source [find interface/stlink.cfg]
transport select hla_swd
reset_config srst_only
adapter_khz 480
Run Code Online (Sandbox Code Playgroud)
我将NUCLEO_F303K8板连接到PC进行此测试。然后,在控制台中发出以下命令:
> openocd -s "C:\...\scripts" …
几年前,我已经尝试过matplotlib在 GUI 中嵌入实时绘图PyQt5。实时绘图显示从传感器捕获的实时数据流、某些过程……我已经成功了,您可以在此处阅读相关帖子:
现在我需要再次做同样的事情。我记得我以前的方法有效,但无法跟上快速的数据流。我在互联网上找到了一些示例代码,我想将它们呈现给您。其中一个显然比另一个快,但我不知道为什么。我想获得更多见解。我相信更深入的了解将使我能够保持互动PyQt5和matplotlib高效。
这个例子基于这篇文章:
https://matplotlib.org/3.1.1/gallery/user_interfaces/embedding_in_qt_sgskip.html
该文章来自官方matplotlib网站,并解释了如何在PyQt5窗口中嵌入matplotlib图形。
我对示例代码做了一些细微的调整,但基本原理仍然是相同的。请将以下代码复制粘贴到 Python 文件中并运行:
#####################################################################################
# #
# PLOT A LIVE GRAPH IN A PYQT WINDOW #
# EXAMPLE 1 #
# ------------------------------------ #
# This code is inspired on: #
# https://matplotlib.org/3.1.1/gallery/user_interfaces/embedding_in_qt_sgskip.html #
# #
#####################################################################################
from __future__ import annotations
from typing import *
import sys
import os
from matplotlib.backends.qt_compat …Run Code Online (Sandbox Code Playgroud) 由 Arduino IDE 执行的 ESP32 flash 命令似乎刷新了两个引导加载程序文件:boot_app0.binat offset0xe000和bootloader_dio_80m.binat offset0x1000。我想知道这两个引导加载程序文件实际上是做什么的,以及为什么有两个。下面我提供一些更多信息。
我所在的团队正在为微控制器开发一种新的免费 IDE:Embeetle IDE。我们计划在不久的将来支持 ESP32 微控制器系列。因此,我现在正在研究 ESP32 构建系统 - 两者ESP-IDF ESP32 项目的工具和 Arduino IDE 方法。
构建.elf文件后,Arduino IDE 会启动一个命令将其转换为二进制文件:
python esptool.py --chip esp32 elf2image
--flash_mode dio
--flash_freq 80m
--flash_size 4MB
-o /tmp/arduino_build_852524/WiFiScan.ino.bin
/tmp/arduino_build_852524/WiFiScan.ino.elf
Run Code Online (Sandbox Code Playgroud)
最后,该WiFiScan.ino.bin文件与两个引导加载程序文件和分区表一起闪存到主板上:
python esptool.py --chip esp32
--port /dev/ttyUSB0
--baud 921600
--before default_reset
--after hard_reset write_flash
-z
--flash_mode dio
--flash_freq 80m
--flash_size detect …Run Code Online (Sandbox Code Playgroud) 经过大量研究,我设法自定义了QTabWidgetPyQt5(Python 3.6)中的 ,以便我可以为任意选项卡分配不同的颜色:
是的,我知道可以使用 CSS 选择器操作某些选项卡,例如:
QTabBar::tab:selectedQTabBar::tab:hoverQTabBar::tab:selectedQTabBar::tab:!selected但是这些选择器都没有解决我遇到的实际问题。如果我想突出显示第二个选项卡 - 无论它是否被选中,悬停,...... - 这些 CSS 选择器都没有帮助我。
我现在将解释我是如何让它最终工作的。之后,我将展示计算密集型部分在哪里,以及为什么我不能把它弄出来。希望你能帮助我提高效率。
您可以在下面找到我的解决方案的源代码。要自己尝试一下,只需将代码复制粘贴到一个新文件(如tab_test.py)中并运行它。在代码下方,您可以找到更多解释。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
#########################################################
# STYLESHEET FOR QTABWIDGET #
#########################################################
def get_QTabWidget_style():
styleStr = str("""
QTabWidget::pane {
border-width: 2px;
border-style: solid;
border-color: #0000ff;
border-radius: 6px;
}
QTabWidget::tab-bar {
left: 5px;
}
""")
return styleStr
#########################################################
# STYLESHEET FOR QTABBAR #
#########################################################
def get_QTabBar_style():
styleStr = …Run Code Online (Sandbox Code Playgroud) 我正在尝试将代码库从 迁移PyQt5到PyQt6. 我在这篇文章中读到(请参阅https://www.pythonguis.com/faq/pyqt5-vs-pyqt6/),所有枚举成员都必须使用其完全限定名称来命名。文章给出了这样的例子:
# PyQt5
widget = QCheckBox("This is a checkbox")
widget.setCheckState(Qt.Checked)
Run Code Online (Sandbox Code Playgroud)
# PyQt6
widget = QCheckBox("This is a checkbox")
widget.setCheckState(Qt.CheckState.Checked)
Run Code Online (Sandbox Code Playgroud)
然后文章继续:
“更新的值太多,无法在这里全部提及。但是,如果您要转换代码库,通常只需在线搜索简短形式,较长的形式就会出现在结果中。”
我明白了。这句话基本上说了一些大意:
“如果 Python 解释器遇到错误,并且错误结果是一个简短的枚举,您可能会在网上找到解决方案。”
我明白了。但这不是我想要迁移代码库的方式。我想要所有简短形式枚举的完整列表,然后对每个枚举执行全局搜索和替换。
我在哪里可以找到这样的列表?