小编Joe*_*Joe的帖子

如何在编译时提取没有路径和后缀的源文件名?

同时使用带有-std = c11的gcc和带有-std = c ++ 14的g ++.

例如,对于一个名为src/dir/Hello.cxx它的文件,它应该扩展为例如:

const char basename[] = "Hello";
Run Code Online (Sandbox Code Playgroud)

要么

const char basename[] = getStaticBasename(__FILE__);
Run Code Online (Sandbox Code Playgroud)

如何getStaticBasename()是一个宏(对于C源)或constexpr函数(对于C++源),其结果为"Hello".

我必须避免__FILE__在运行时拆分字符串,因为路径和后缀不能以任何方式编译到可执行文件中.

解决方案必须不依赖于大型库,例如boost.

因为我没有makefile,所以在我的情况下不能使用这样的解决方案.

有人有解决方案吗?

编辑2015-07-02:

  • 我对如何调用编译器和链接器没有影响(有时通过makefile,有时来自命令行,或某些IDE(Eclipse CDT托管make,Crossworks,Xcode等等).所以解决方案只需要代码.
  • 我的用例是为小型日志记录解决方案提供某种"通用区域标识符".应用程序代码(使用我的记录器)应该只#include <Joe/Logger.h>在后面的调用中,例如LOG_DEBUG(...)我将隐含地使用自动生成的"通用区域标识符".
  • 我目前的解决方案是应用程序代码必须在它放入代码之前声明一个JOE_LOG_FILE_REGION(Hello);(之后#include <Joe/Logger.h>)LOG_DEBUG(...).

c c++ c++11 c11 c++14

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

如何将变量从Jenkinsfile传递给shell命令

我想使用我在Jenkinsfile脚本中使用的变量,然后将其值传递给shell脚本执行(作为环境变量或命令行参数).

但是以下内容Jenkinsfile:

for (i in [ 'a', 'b', 'c' ]) {
    echo i
    sh 'echo "from shell i=$i"'
}
Run Code Online (Sandbox Code Playgroud)

给出输出:

a
from shell i=
b
from shell i=
c
from shell i=
Run Code Online (Sandbox Code Playgroud)

期望的输出是这样的:

a
from shell i=a
b
from shell i=b
c
from shell i=c
Run Code Online (Sandbox Code Playgroud)

知道如何将值传递i给shell scipt吗?

编辑:根据马特的回答,我现在使用这个解决方案:

for (i in [ 'a', 'b', 'c' ]) {
    echo i
    sh "i=${i}; " + 'echo "from shell i=$i"'
}
Run Code Online (Sandbox Code Playgroud)

优点是,我不需要"在shell脚本中转义.

shell groovy jenkins jenkins-pipeline jenkinsfile

16
推荐指数
2
解决办法
3万
查看次数

如何从一系列位图创建视频流并通过IP网络发送?

我有一个裸机应用程序在带有10BASE-T以太网(CS8900)的微型16位微控制器(ST10)和基于EasyWeb项目的Tcp/IP实现上运行.

该应用程序的主要工作是控制公共交通乘客信息的LED矩阵显示.它生成大约41 fps的显示信息和可配置的显示尺寸,例如160×32像素,1位颜色深度(每个LED可以打开或关闭).

例:

在此输入图像描述

有一个小的网络服务器实现,它提供相应的帧缓冲内容(相当于led矩阵显示内容)作为PNG或BMP下载(由于CPU负载和1位颜色深度未压缩).所以我可以通过以下方式接收快照:

wget http://$IP/content.png
Run Code Online (Sandbox Code Playgroud)

要么

wget http://$IP/content.bmp
Run Code Online (Sandbox Code Playgroud)

或者将适当的html代码放入控制器中index.html以在Web浏览器中查看.我也可以编写html/javascript代码来定期更新该图片,例如每秒,以便用户可以看到显示内容的变化.

现在进行下一步,我想将显示内容作为某种视频流提供,然后将适当的html代码添加到我的index.html或只是用例如vlc打开"流URI" .

由于我的帧缓冲位图是未压缩的,我期望一个恒定的比特率.

我不确定从这个开始的最佳方式是什么.

(1)如果我已经为每个帧准备了一个PNG,那么哪个视频格式最容易生成(但我只有几毫秒的PNG并且不能长时间缓冲它)?

请注意,我的目标系统在内存和计算能力方面都受到资源限制.

(2)通过IP分发哪种方式?

我已经打开了一些tcp套接字用于侦听端口80.我可以通过使用分块传输编码(每个帧作为一个自己的块)通过HTTP(接收后)流式传输视频.(也许HTTP Live Streaming这样做?)

我也读过像SCTP,RTP和RTSP这样的思考,但在我的目标上实现这个看起来更像是一件事.由于还有潜在的防火墙缺点,我认为我更喜欢HTTP进行传输.

请注意,应用程序使用纯C编码,没有操作系统或强大的库.所有的东西都是从头开始编码的,甚至是Web服务器和PNG代.

编辑2017-09-14,试用APNG

正如Nominal Animal所说,我尝试使用APNG.

我延伸我的代码,以产生适当的fcTLfdAT组块的每个帧,并提供bla.apng与HTTP内容类型image/apng.

下载后,bla.apng它们看起来很有用,例如在firefox或chrome中打开(但不是在 konqueror, vlc, dragon player, gwenview).

尝试流式播放该apng可以很好地工作但只能使用firefox.Chrome希望首先完全下载该文件.

所以APNG可能是一个解决方案,但缺点是它目前只适用于firefox.经过进一步测试后我发现,在APNG播放约1小时后,32位版本的Firefox(55.0.2)崩溃了,此时已传输了大约100 MiB的数据.看起来他们不会丢弃旧/过时的帧.

进一步的限制:由于APNG需要在每个动画块上具有32位"序列号"(每帧需要2个),因此最大播放持续时间可能存在限制.但是对于我24毫秒的帧速率,这个持续时间限制大约是600天,所以我可以忍受.

需要注意的是APNG MIME类型是由mozilla.org指定image/apng.但是在我的测试中,我发现当我的HTTP服务器提供带有Content-Type的APNG时,它会得到更好的支持image/png.例如,iOS上的Chromium和Safari将在下载后播放我的APNG文件(但仍然不是流式传输).甚至维基百科服务器也提供例如具有Content-Type的这个沙滩球APNGimage/png.

编辑2017-09-17,试用动画GIF

正如 …

c http bare-metal video-streaming

11
推荐指数
1
解决办法
851
查看次数

如何避免模板实例化和符号表发出的C++代码膨胀?

几年前我开始了一个裸机(Cortex-M)项目.在项目设置中,我们决定使用gcc工具链和C++ 11/C++ 14等启用,甚至使用C++异常和rtti.

我们目前正在使用来自launchpad.net/gcc-arm-embedded的gcc 4.9(有一些问题阻止我们目前更新到更新的gcc版本).

例如,我写了一个基类和这样的派生类(另请参见此处运行示例):

class OutStream {
public:
    explicit OutStream() {}
    virtual ~OutStream() {}
    OutStream& operator << (const char* s) {
        write(s, strlen(s));
        return *this;
    }
    virtual void write(const void* buffer, size_t size) = 0;    
};

class FixedMemoryStream: public OutStream {
public:
    explicit FixedMemoryStream(void* memBuffer, size_t memBufferSize): memBuffer(memBuffer), memBufferSize(memBufferSize) {}
    virtual ~FixedMemoryStream()       {}
    const void*  getBuffer() const     { return memBuffer; }
    size_t       getBufferSize() const { return memBufferSize; }
    const char*  getText() const       { return …
Run Code Online (Sandbox Code Playgroud)

gcc templates bare-metal c++11

9
推荐指数
1
解决办法
984
查看次数

如何在Kubuntu 16.04上的Eclipse Mars和Neon中保持滚动条可见

在使用Kubuntu 16.04和Eclipse Neon(4.6)设置新机器之后,我在eclipse中观察到所有滚动条的以下行为:

  • 垂直滚动条以一种较薄的样式显示
  • 在垂直滚动条上移动鼠标时,滚动条在标准宽度下变为可见
  • 当大约1秒钟不移动鼠标时,滚动条将变得不可见(平滑淡出)
  • 在编辑器窗口中将鼠标移动到任何位置时,垂直滚动条将重新显示(以细字体显示)
  • 注意:水平滚动条的行为不同,因为只有当鼠标指针(悬停)触摸时,水平滚动条才可见

关于薄型滚动条,我喜欢此功能。但是我不喜欢垂直滚动条完全消失的功能。

有人知道如何自定义吗?

我已经测试了以下所有设置:

  • Kubuntu 16.04和Eclipse Neon吗?滚动条被隐藏
  • Kubuntu 16.04和Eclipse火星?滚动条被隐藏
  • Kubuntu 16.04和Eclipse Luna吗?滚动条保持可见
  • Kubuntu 14.04和Eclipse火星?滚动条保持可见
  • Kubuntu 14.04和Eclipse Luna吗?滚动条保持可见

尝试使用不同的主题(“窗口”?“偏好设置”?“常规”?“外观”)时,即使在完全禁用主题设置时,也无法成功获得滚动条可见性。

我当前的解决方法是SWT_GTK3=0在开始Eclipse之前设置环境变量。这似乎使所有的scollbars保持可见,但缺点是在不需要时也显示了滚动条(例如,编辑器窗口中的内容较少),并且上述稀薄样式功能不再可用。

编辑2018-01-17:尝试GTK_OVERLAY_SCROLLING=0使用@gregh也可以。以不同于的图形样式显示滚动条SWT_GTK3=0。现在比与更好地匹配我的系统UI设计SWT_GTK3=0

eclipse ubuntu

7
推荐指数
2
解决办法
2680
查看次数

当使用c ++静态初始化程序时,Linux共享库init&deinit

我想要自动调用来初始化和取消初始化我的共享库.

在我的共享库中,我需要对C++对象进行一些静态初始化,其中包括使用第三方代码(例如UnitTest ++).当执行我的init函数时,我需要保证,C++对象(所有链接的翻译单元)的所有静态初始化都已完成(反之亦然); 因此,与main()的执行在C++程序中可以预期的条件相同.

我已经看到很多关于linux共享库init/deinit的信息,例如:

但提供的解决方案不符合我的需求.在两种方法(__attribute__((constructor))甚至-Wl,-init,<function name>)中,似乎在完全完成C++对象的静态初始化之前调用init函数.

我也__attribute__ ((init_priority(…)))喜欢玩:

class InitAndDeinit {
public:
    InitAndDeinit() {
        // Do some initialization
    }
    ~InitAndDeinit() {
        // Do some cleanup
    }
} initAndDeinit __attribute__((init_priority(65535)));
Run Code Online (Sandbox Code Playgroud)

但是,这也不会将呼叫置于期望的位置; 即使有__attribute__((constructor(65535))).

我用gcc 4.6.4,4.7.3和4.8.1进行了测试(4.6.4显示了关于排序的略微不同的行为__attribute__((constructor))).

有什么建议?

我目前的解决方法是提供必须由应用程序手动调用的导出函数(lib_init()和lib_deinit()).

c++ linux gcc initialization shared-libraries

6
推荐指数
1
解决办法
3491
查看次数

用于Linux的蓝牙LE GUI工具

我目前正在开发蓝牙LE嵌入式项目.

为了发现我的BLE外设,我目前使用Android 4.3的一些应用程序(例如Nordic nRF ToolboxnRF Master Control Panel)和iOS(LightBlue).

在我的桌面PC上(运行kubuntu 12.04),我目前在命令行中使用hcitool和gatttool,例如用于查看和更改我的BLE外围设备的特征值.

有没有人知道,如果有一个可用于linux的gui工具,具有北欧nRF Android应用程序或类似LightBlue for iOS的类似功能?

我想使用linux GUI工具:

  • 探索我的广告BLE外设
  • 连接他们
  • 发现他们提供的服务和特点
  • 查看和更改特征值

linux bluetooth-lowenergy

6
推荐指数
1
解决办法
5706
查看次数

当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

使用以下设置:

使用 JLinkGDBServer 和 eclipse 作为调试前端,我在单步执行我的代码时总是有一个很好的堆栈跟踪。使用 Code Confidence freertos 工具(eclipse 插件)时,我还会看到当前未运行的所有线程的堆栈跟踪(没有该插件,我只能看到活动线程的堆栈跟踪)。到现在为止还挺好。

但是现在,当我的应用程序陷入硬故障时,堆栈跟踪就会丢失。嗯,我知道如何找出导致hardfault代码地址的技术(如看到这里)。但与完整的堆栈跟踪相比,这是非常糟糕的信息。

好的,有时当陷入硬故障时,无法保留堆栈跟踪,例如,当堆栈被错误代码损坏时。但是如果堆栈是健康的,我认为获得堆栈跟踪是可能的(不是吗?)。

我认为在硬故障时丢失堆栈跟踪的原因是,Cortex-M3 架构会自动将堆栈指针从 PSP 切换到 MSP。现在的一个想法是,(也许)将 MSP 设置为之前的 PSP 值(并且可能需要做一些额外的堆栈准备?)。

关于如何做到这一点或其他方法在硬故障时保留堆栈跟踪的任何建议?

编辑 2015-07-07,添加了更多细节。

我使用此代码来引发硬故障:

__attribute__((optimize("O0"))) static void checkHardfault() {
    volatile uint32_t* varAtOddAddress = (uint32_t*)-1;
    (*varAtOddAddress)++;
}
Run Code Online (Sandbox Code Playgroud)

进入 时checkHardfault(),我的堆栈跟踪看起来不错:

gdb-> backtrace
#0  checkHardfault () at Main.cxx:179
#1  0x100360f6 in GetOneEvent () at Main.cxx:185 …
Run Code Online (Sandbox Code Playgroud)

c c++ cortex-m3 freertos

6
推荐指数
1
解决办法
3099
查看次数

如何允许解码 UTF-8 字节数组?

我需要将存储在字节数组中的 UTF-8 序列解码为字符串。

\n\n

UTF-8 序列可能包含错误部分。在这种情况下,我需要尽可能多地解码并(可选?)用“?”之类的内容替换无效部分。

\n\n
# First part decodes to "AB\xc3\x84C"\nb = bytearray([0x41, 0x42, 0xC3, 0x84, 0x43])\ns = str(b, "utf-8") \nprint(s)\n\n# Second part, invalid sequence, wanted to decode to something like "AB?C"\nb = bytearray([0x41, 0x42, 0xC3, 0x43])\ns = str(b, "utf-8")\nprint(s)\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 Python 3 中实现这一目标的最佳方法是什么?

\n

python error-handling decode utf-8 python-3.x

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

如何在 YAML 中将字符串分成多行并保留空格?

请注意,这个问题与此类似,但仍然不同,因此这些答案无法解决我的问题:

  • 为了插入例如控制字符\x08,似乎我必须使用双引号"
  • 所有空间都需要完全按照给定的方式保留。对于换行符,我明确使用\n.

我有一些字符串数据需要存储在 YAML 中,例如:

  • " This is my quite long string data "
  • "This is my quite long string data"
  • "This_is_my_quite_long_string_data"
  • "Sting data\nwhich\x08contains control characters"

并在 YAML 中需要它,如下所示:

Key: "  This  is  my" +
     "  quite  long " +
     " string  data  "
Run Code Online (Sandbox Code Playgroud)

只要我留在单行上,这就没问题,但我不知道如何将字符串内容放在多行上。

YAML 块标量样式 ( >, |) 在这里没有帮助,因为它们不允许转义,甚至会执行一些空格剥离、换行符/空格替换,这对我的情况毫无用处。

看起来唯一的方法似乎是使用双引号"和反斜杠\,如下所示:

Key: "\
  This is \
  my quite \
  long string data\
  "
Run Code Online (Sandbox Code Playgroud)

在YAML 在线解析器 …

string yaml

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