小编K.M*_*ier的帖子

关于GNU make依赖文件*.d

在程序的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)

makefile gnu-make

5
推荐指数
1
解决办法
5892
查看次数

了解 ctags 文件格式

我使用“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该文件中的行。
  • 标签是 type 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)

arm ctags exuberant-ctags cortex-m

5
推荐指数
1
解决办法
2571
查看次数

为什么这个单例实现"不是线程安全的"?

1. @Singleton装饰

我找到了一种优雅的方法来装饰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)

python singleton multithreading python-3.x python-3.6

5
推荐指数
2
解决办法
4507
查看次数

为什么 pyqtSignal() 是一个类属性,而它实际上表现为一个实例属性?

阅读帖子https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide 后,我想我掌握了class attributes和之间的区别instance attributes。但是仍然有一个我无法解释的奇怪现象:pyqtSignal()PyQt 中的行为。

 

1.关于类属性

我了解到类属性存在于类的命名空间中。如果您访问这样的变量——例如class_var——通过一个实例,Python 将首先查看该实例的命名空间。在那里找不到它,Python 会查看类的命名空间。

1.1 原始类属性

让我们看一个类属性,它是一个简单的整数。您应该通过类本身访问它,但您也可以通过其实例之一来访问它:

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)

python pyqt signals-slots python-3.x pyqt5

5
推荐指数
0
解决办法
439
查看次数

PyQt5:如何为每个角色设置自定义鼠标指针?

1.简介

我正在使用PyQt5 for GUI 在Python 3.7中创建一个应用程序。我想在应用程序中自定义鼠标光标。

让我们从Qt5中设置的标准光标开始,如下表所示:https : //doc.qt.io/qt-5/qt.html#CursorShape-enum。您会注意到Qt5有一个专用的Enum,它Qt::CursorShape描述了相应游标的作用。例如:

Qt标准游标

 
我想用自定义光标替换每个标准Qt光标

自定义光标

 

2.第一种方法

一开始我尝试过这样的事情:

pixmap = QPixmap("C:/../my_arrow.png")
cursor = QCursor(pixmap, 32, 32)
QApplication.setOverrideCursor(cursor)
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种方法对我的目的不利。从文档中:

应用程序覆盖游标旨在向用户显示应用程序处于特殊状态,例如在可能需要一段时间的操作期间。
 
覆盖光标将显示在应用程序的所有小部件中,直到调用restoreOverrideCursor()或另一个setOverrideCursor()

换句话说,使用该setOverrideCursor()方法有两个缺点:

  1. 我将不得不手动跟踪鼠标指针应更改为哪个角色,setOverrideCursor()每次都调用并向其提供适当的QCursor()

  2. 我需要跟踪Qt自动调用的位置restoreOverrideCursor(),因为这实际上会撤消我自己的更改。与Qt的斗争将是永恒的。

 

3.第二种方法

我的第二种方法是使用该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)

python qt pyqt qt5 pyqt5

5
推荐指数
1
解决办法
468
查看次数

如何使用OpenOCD ping芯片(检测是否连接了芯片)

1.问题解释

我正在尝试将OpenOCD用于不常见的事情。除了连接芯片,我只想检测芯片。
我想到的过程将如下所示:

  1. 使用参数作为探针的配置文件(例如stlink.cfg)启动OpenOCD -f。因此,OpenOCD知道要使用哪种探针,但不知道它将找到哪种芯片。

  2. OpenOCD检测到芯片并以某种方式报告该错误(例如,向stdout写一些东西)。如果可能的话,此操作不应对芯片造成干扰(例如将其重置)。

  3. 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日构建)。

 

2.到目前为止我尝试过的

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" …

embedded microcontroller jtag openocd swd

5
推荐指数
1
解决办法
569
查看次数

如何在 PyQt5 GUI 中快速绘制 matplotlib 实时绘图

几年前,我已经尝试过matplotlib在 GUI 中嵌入实时绘图PyQt5。实时绘图显示从传感器捕获的实时数据流、某些过程……我已经成功了,您可以在此处阅读相关帖子:

现在我需要再次做同样的事情。我记得我以前的方法有效,但无法跟上快速的数据流。我在互联网上找到了一些示例代码,我想将它们呈现给您。其中一个显然比另一个快,但我不知道为什么。我想获得更多见解。我相信更深入的了解将使我能够保持互动PyQt5matplotlib高效。

 

1.第一个例子

这个例子基于这篇文章:
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)

python plot matplotlib python-3.x pyqt5

5
推荐指数
1
解决办法
2万
查看次数

文件 boot_app0.bin 和 bootloader_dio_80m.bin 的用途是什么?(ESP32 - Arduino IDE)

由 Arduino IDE 执行的 ESP32 flash 命令似乎刷新了两个引导加载程序文件:boot_app0.binat offset0xe000bootloader_dio_80m.binat offset0x1000。我想知道这两个引导加载程序文件实际上是做什么的,以及为什么有两个。下面我提供一些更多信息。

1. 背景

我所在的团队正在为微控制器开发一种新的免费 IDE:Embeetle IDE。我们计划在不久的将来支持 ESP32 微控制器系列。因此,我现在正在研究 ESP32 构建系统 - 两者ESP-IDF ESP32 项目的工具和 Arduino IDE 方法。

2. ESP32项目的Arduino IDE flash程序

构建.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)

microcontroller arduino firmware esp32 arduino-esp32

5
推荐指数
1
解决办法
5896
查看次数

为单个标签指定颜色会消耗太多处理能力

经过大量研究,我设法自定义了QTabWidgetPyQt5(Python 3.6)中的 ,以便我可以为任意选项卡分配不同的颜色:

在此处输入图片说明

是的,我知道可以使用 CSS 选择器操作某些选项卡,例如:

  • QTabBar::tab:selected
  • QTabBar::tab:hover
  • QTabBar::tab:selected
  • QTabBar::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)

python pyqt python-3.x qtabwidget pyqt5

4
推荐指数
1
解决办法
3272
查看次数

迁移到 Qt6/PyQt6:Qt5 中所有已弃用的短格式名称是什么?

我正在尝试将代码库从 迁移PyQt5PyQt6. 我在这篇文章中读到(请参阅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 解释器遇到错误,并且错误结果是一个简短的枚举,您可能会在网上找到解决方案。”

我明白了。但这不是我想要迁移代码库的方式。我想要所有简短形式枚举的完整列表,然后对每个枚举执行全局搜索和替换。

我在哪里可以找到这样的列表?

qt pyqt qt6 pyqt6

4
推荐指数
1
解决办法
2729
查看次数