RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-209264

Maxim Timakov's questions

Martin Hope
Maxim Timakov
Asked: 2025-03-17 02:31:24 +0000 UTC

通过在 OpenOCD 中添加 Flash ID 修复未知闪存设备错误

  • 5

尝试调试 RP2040(R-Pi Pico)上的固件时,OpenOCD 给出错误“错误:未知闪存设备(ID 0x00184068)”

该板有一个存储芯片“BY25Q128ES - 128M BIT SPI NOR FLASH”

在Raspberry Pi 论坛上,他们讨论了修补文件src/flash/nor/spi.c 的必要性

我找到了内存芯片的数据表,但我不太明白我需要在其中查找哪些参数才能正确填写FLASH_ID

宏本身创建该类型的对象flash_device并具有签名:

/// @file: src/flash/nor/spi.h

/* data structure to maintain flash ids from different vendors */
struct flash_device {
    const char *name;
    uint8_t read_cmd;
    uint8_t qread_cmd;
    uint8_t pprog_cmd;
    uint8_t erase_cmd;
    uint8_t chip_erase_cmd;
    uint32_t device_id;
    uint32_t pagesize;
    uint32_t sectorsize;
    uint32_t size_in_bytes;
};

#define FLASH_ID(n, re, qr, pp, es, ces, id, psize, ssize, size) \
{                                   \
    .name = n,                      \
    .read_cmd = re,                 \
    .qread_cmd = qr,                \
    .pprog_cmd = pp,                \
    .erase_cmd = es,                \
    .chip_erase_cmd = ces,          \
    .device_id = id,                \
    .pagesize = psize,              \
    .sectorsize = ssize,            \
    .size_in_bytes = size,          \
}
/// @file: src/flash/nor/spi.c

// ....

 /* Shared table of known SPI flash devices for SPI-based flash drivers. Taken
  * from device datasheets and Linux SPI flash drivers. */
const struct flash_device flash_devices[] = {
    /* Note: device_id is usually 3 bytes long, however the unused highest byte counts
     * continuation codes for manufacturer id as per JEP106xx.
     *
     * All sizes (page, sector/block and flash) are in bytes.
     *
     * Guide to select a proper erase command (if both sector and block erase cmds are available):
     * Use 4kbit sector erase cmd and set erase size to the size of sector for small devices
     * (4Mbit and less, size <= 0x80000) to prevent too raw erase granularity.
     * Use 64kbit block erase cmd and set erase size to the size of block for bigger devices
     * (8Mbit and more, size >= 0x100000) to keep erase speed reasonable.
     * If the device implements also 32kbit block erase, use it for 8Mbit, size == 0x100000.
     */
    /*        name                  read qread  page  erase chip  device_id   page   erase   flash
     *                              _cmd _cmd   _prog _cmd* _erase            size   size*   size
     *                                          _cmd        _cmd
     */
    FLASH_ID("st m25pe10",          0x03, 0x00, 0x02, 0xd8, 0x00, 0x00118020, 0x100, 0x10000, 0x20000),
//....
    FLASH_ID("st m25p05",           0x03, 0x00, 0x02, 0xd8, 0xc7, 0x00102020, 0x80,  0x8000,  0x10000),
//...
    FLASH_ID("sp s25fl512s",        0x13, 0x00, 0x12, 0xdc, 0xc7, 0x00200201, 0x200, 0x40000, 0x4000000),

在这种情况下,什么是“pagesize和” sectorsize?

在闪存芯片的数据表中它应该叫什么?

c
  • 1 个回答
  • 33 Views
Martin Hope
Maxim Timakov
Asked: 2025-03-03 23:52:01 +0000 UTC

从 flatpak 设置软件的权限

  • 5

flatpak的QtCreator看不到系统中安装的开发包。确切地说, QtCreator自带的CMake
找不到它们。

同时,从控制台启动的系统CMake会找到这些库。

dev 软件包是通过系统管理器安装的(sudo apt install libname-dev)

flatpak的其他应用程序也存在类似的问题(例如ArduinoIDE )

据我了解,FlatPak有点像沙箱,默认情况下程序无法访问整个系统。

问题本身:如何从flatpak配置QtCreator访问,以便它可以看到系统中安装的库?

UPD 0:
该软件包包括QtCreator一组实用程序和库。
它的副本cmake等pkg-config...
QtCreator使用它们,它们是位于“Creator”包中的配置......

在这种情况下,“内部”和“外部”文件的位置相交。

尤其pkg-config:

# в песочнице
$ ls /usr/lib/x86_64-linux-gnu/pkgconfig/ | wc -l
771

# в системе
$ ls /usr/lib/x86_64-linux-gnu/pkgconfig/ | wc -l
488

显然,“系统”文件与“沙盒”相连,因为 /var/run/host/

linux
  • 1 个回答
  • 21 Views
Martin Hope
Maxim Timakov
Asked: 2025-02-13 02:18:30 +0000 UTC

在 ESP32-WROOM-32 上扫描 I2C 时出错

  • 5

ESP32-WROOM-32 上有一个 DevBoard(30 针版本、USB-Type-C、CH340C)

ESP32-Wroom-32 在此处输入图片描述

Connecting.....
Chip is ESP32-D0WD-V3 (revision v3.1)

我画出了扫描仪的代码:

// ESP-IDF v5.4
#include <stdio.h>

#include <esp_err.h>
#include <esp_system.h>
#include <driver/gpio.h>
#include <driver/i2c_master.h>
#include <driver/i2c_types.h>

#include <freertos/FreeRTOS.h>
#include <freertos/task.h>


esp_err_t init_i2c(i2c_master_bus_handle_t * handle)
{
    i2c_master_bus_config_t bus = {
            .i2c_port = I2C_NUM_0,
            .sda_io_num = GPIO_NUM_21,
            .scl_io_num = GPIO_NUM_22,
            .clk_source = I2C_CLK_SRC_DEFAULT,
            .glitch_ignore_cnt = 7,
            .intr_priority = 0, // use default
            .trans_queue_depth = 0, // no async ops
            .flags.enable_internal_pullup = true,
            .flags.allow_pd = 0, // disallow power down
    };

    return i2c_new_master_bus(&bus, handle);
}

void app_main(void)
{
    i2c_master_bus_handle_t bus = NULL;

    gpio_set_direction(GPIO_NUM_2, GPIO_MODE_OUTPUT); // onboard blue led

    gpio_set_level(GPIO_NUM_2, true);

    ESP_ERROR_CHECK(init_i2c(&bus));

    for (uint16_t addr = 1; addr < 127; ++addr)
    {
        esp_err_t result = i2c_master_probe(bus, addr, -1); // -1 == infinity
        const char * reaction = "Unknown error";

        switch (result)
        {
            case ESP_OK:
                reaction = "OK";
                break;
            case ESP_ERR_NOT_FOUND:
                reaction = "NOT FOUND";
                break;
            case ESP_ERR_TIMEOUT:
                reaction = "TIMEOUT (bus failure)";
                break;
            default:
                break;
        }

        printf("%02X : %s (%d) \n", addr, reaction, result);
    }
    gpio_set_level(GPIO_NUM_2, false);

    ESP_ERROR_CHECK(i2c_del_master_bus(bus));

    printf("Restart:");
    for (int i = 10; i > 0; --i)
    {
        printf(" %d", i);
        fflush(stdout);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
    printf(" NOW!\n");
    esp_restart();
}

i2c_master_probe调用调试控制台时,它会抛出总线错误:

E (279) i2c.master: I2C hardware timeout detected
E (279) i2c.master: probe device timeout. Please check if xfer_timeout_ms and pull-ups are correctly set up

告诉我我可能哪里搞砸了?

附加信息:

  • 有 2 个设备连接到总线(Arduino 模块,每个模块都有自己的上拉电阻)
  • 设备正在运行 - 在 Arduino Uno 和 Raspberry Pi 上检测到
  • 当交换GPIO_NUM_21<-> GPIO_NUM_22(物理上 + 在总线设置中)时,错误消失,但未检测到设备。
c
  • 1 个回答
  • 28 Views
Martin Hope
Maxim Timakov
Asked: 2024-07-01 22:39:15 +0000 UTC

GNU/Linux 的空调制解调器模拟器

  • 5

我正在编写一个程序通过 COM 端口与设备交互。

该设备本身对我来说不可用,因此出现了有关模拟器的问题。

对于 Windows,有 com2com。

Linux 下有类似的程序吗?

linux
  • 1 个回答
  • 22 Views
Martin Hope
Maxim Timakov
Asked: 2024-05-04 00:55:05 +0000 UTC

在 CLion 或 QtCreator 中调试 WASM 项目

  • 5

有一个使用vcpkg 的 WebAssembly宠物项目。

我使用 CLion 来编写代码。

我为 WASM 配置了编译。该项目是通过命令行在 Node.js 中构建并启动的。

现在如何直接从 IDE 配置启动和调试?
我对 CLion/QtCreator 设置感兴趣,但它也适用于其他 IDE。

UPD0:我想出了如何在 CLion 中运行它:

  • 你需要在界面中找到目标
  • 调用上下文菜单
  • 选择运行或调试 - 将创建启动配置并启动应用程序

但这是关于调试和运行 JavaScript 的。调试WebAsm尚不清楚。

c++
  • 1 个回答
  • 25 Views
Martin Hope
Maxim Timakov
Asked: 2023-04-29 04:04:11 +0000 UTC

asio::strand 是如何工作的?

  • 6

再会。

如果我没理解错的话,asio::strand需要依次进行相关操作。

但是我的操作仍然很混乱。

m 140460063954752
0 140460063950400
1 140460063950400
2 140460055557696
4 140460055557696
3 140460063950400
6 140460063950400
7 140460063950400
8 140460063950400
9 140460063950400
5 140460055557696

问题:我做错了什么?

代码:

#include <iostream>

#include <thread>
#include <mutex>
#include <chrono>
#include <boost/asio.hpp>

namespace asio = boost::asio;
namespace io = asio;
namespace ip = io::ip;

using namespace std::chrono_literals;

void run_pool(asio::io_context& pool, std::size_t n)
{
    std::vector<std::thread> jobs;
    jobs.reserve(n);
    for (std::size_t i = 0; i < n; ++i)
        jobs.emplace_back([&pool]{ pool.run(); });
    for (std::size_t i = 0; i < n; ++i)
        jobs[i].join();
}

void run_pool(asio::thread_pool& pool, std::size_t /*n*/)
{
    pool.wait();
}

int main()
{
    using pool_t = std::conditional_t<false, asio::thread_pool, asio::io_context>;
    int n_t = static_cast<int>(std::thread::hardware_concurrency());
    std::cout << "num threads: " << n_t << std::endl;
    pool_t pool{};
    std::mutex mtx_io;
    auto strand = asio::make_strand(pool);
    std::cout << "m " << std::this_thread::get_id() << std::endl;
    for (std::size_t n = 0; n < 10; ++n) {
        auto token = [n, &mtx_io] {
            std::cout << n << " " << std::this_thread::get_id() << std::endl;
        };
        asio::post(pool, asio::bind_executor(strand, std::move(token)));
    }
    run_pool(pool, n_t);
    return 0;
}

预期行为:n按顺序输出

当前行为:n随机显示

试用asio 1.24和boost::asio 1.82测试Linux Mint

c++
  • 1 个回答
  • 18 Views
Martin Hope
Maxim Timakov
Asked: 2022-05-16 01:57:39 +0000 UTC

this 指针在使用自定义错误处理程序调用 lua_pcall 后被覆盖

  • 1

Lua API 有一个包装类:

class Lua
{
public /* lua api */:
    //....
private /* members */:
    lua_State* lua;
    //....
};

我需要在脚本中扩展有关错误的信息:在错误发生时添加 StackTrace 和变量值。

好的,我正在添加视图功能

static int add_stack_trace(lua_State* lua)
{
    std::ostringstream msg;
    lua_Debug record;
    
    msg << std::endl
        << lua_tostring(lua, -1) // original error message
        << std::endl;
    
    for (int level = 0; lua_getstack(lua, level, &record); level++)
    {
        lua_getinfo(lua, "Snlu", record);
        msg << " [" << record.what << "]"
            << " line" << std::setw(6) << record.currentline << " : " << record.short_src // error position
            << " it function '" << (record.name ? record.name : "{no name}") << "'"       // function name
            << " lines " << record.linedefined << " .. " << record.lastlinedefined        // function lines
            << std::endl;
    }
    
    auto result = msg.str();
    lua_pushlstring(lua, result.c_str(), result.size());
    return 1;
}

为:制作包装器lua_pcall:

int Lua::pcall(int numArgs, int numResults)
{
    lua_pushcfunction(lua, &Lua::add_stack_trace);
    lua_insert(lua, 1);
    auto code = ::lua_pcall(lua, numArgs, numResults, 1); // use add_stack_trace as error handler
    lua_remove(lua, 1);

    return code;
}

然后“乐趣”开始了:

当使用自定义处理程序并且脚本中出现错误时,应用程序开始崩溃并出现内存访问错误。

重现错误的最小处理程序代码:

int handler(lua_State* lua)
{
    lua_Debug record{};
    for (int level = 0; lua_getstack(lua, level, &record); level++)
    {
    }
    return 1;
}

通过调试器判断,在调用期间,值(地址本身)lua_pcall + handler以某种方式被覆盖this


实际上问题是:为什么会发生这种情况以及如何克服它?


附加信息:

  • 该问题仅在Release
  • 装配为x64
  • Visual Studio 2017和使用的编译器LuaJIT-2.0.x。
c++
  • 1 个回答
  • 10 Views
Martin Hope
Maxim Timakov
Asked: 2020-09-21 02:15:22 +0000 UTC

Qt5。如何暂时禁用子小部件的事件生成?

  • 1

我正在编写参数编辑器小部件,从子小部件生成事件时出现问题。

小部件本身订阅子小部件的更改并转发上面的事件。
假设编辑器包含一对QLineEdit:

class Editor(QWidget):
    paramsChanged = Signal(str, str)
    
    def __init__(self, parent= None):
        super().__init__(parent)
        self.__build_ui()
    
    def __build_ui(self):
        self.__a = QLineEdit()
        self.__b = QLineEdit();
        
        box = QVBoxLayout()
        
        box.addWidget(self.__a)
        box.addWidget(self.__b)
        self.__a.textChanged.connect(self.__on_paramChanged)
        self.__b.textChanged.connect(self.__on_paramChanged)
        
        self.setLayout(box)
        
    def __on_paramChanged(self):
        self.paramsChanged.emit(self.__a.text(), self.__b.text())
    
    def setParams(self, a, b):
        self.__a.setText(a)
        self.__b.setText(b)

当以编程方式设置值时,子小部件会生成“更改”事件。

editor.setParams("a", "b")

日志:

changed a 
changed a b

实际上问题是:如何
在加载参数()期间Editor::setParams禁用子小部件的事件生成?

完整的代码Python + PySide2

# -*- coding: utf-8 -*-
import sys

from PySide2.QtCore import *
from PySide2.QtWidgets import *


class Editor(QWidget):
    paramsChanged = Signal(str, str)

    def __init__(self, parent= None):
        super().__init__(parent)
        self.__build_ui()

    def __build_ui(self):
        self.__a = QLineEdit()
        self.__b = QLineEdit();

        box = QVBoxLayout()

        box.addWidget(self.__a)
        box.addWidget(self.__b)
        self.__a.textChanged.connect(self.__on_paramChanged)
        self.__b.textChanged.connect(self.__on_paramChanged)

        self.setLayout(box)

    def __on_paramChanged(self):
        self.paramsChanged.emit(self.__a.text(), self.__b.text())

    def setParams(self, a, b):
        self.__a.setText(a)
        self.__b.setText(b)


def on_change(a, b):
    print("changed", a, b)


if __name__ == '__main__':
    app = QApplication(sys.argv)

    editor = Editor()
    editor.paramsChanged.connect(on_change)

    editor.show()

    editor.setParams("a", "b")

    sys.exit(app.exec_())
qt
  • 2 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5