我的 C 代码中内置了一个标准的日志 API,这是一个很好的简单的logF(const char *pFormat, ...)东西,到目前为止,它一直被映射到vprintf(),即:
void logF(const char *pFormat, ...)
{
va_list args;
va_start(args, pFormat);
vprintf(pFormat, args);
va_end(args);
}
Run Code Online (Sandbox Code Playgroud)
此 API 上方的 C 代码必须适用于多个嵌入式平台。我刚刚到达了一个平台 (Nordic NRF52840),在该平台中,我必须使用的底层日志记录接口显示为表单的可变参数宏NRF_LOG_INFO(...)。
问题:如何正确传递fn(const char *pFormat, ...)到BLAH(...)宏?我的脑袋疼....
这是 GCC 4.9.3,不过如果有一个对 C 编译器版本相对宽松的解决方案会很好。
编辑 1:注意到我可以将我的logF()函数重新定义为可变参数宏并将其映射到那里,问题是我将拥有一个特定于平台的头文件而不是通用头文件,我必须将它移到平台中代码,每个都有一个。并非不可能,但更混乱。
编辑 2:我被问到如何NRF_LOG_INFO()扩展的线索。这是预处理器的相关输出:
#define NRF_LOG_INFO(...) NRF_LOG_INTERNAL_INFO( __VA_ARGS__)
#define NRF_LOG_INTERNAL_INFO(...) NRF_LOG_INTERNAL_MODULE(NRF_LOG_SEVERITY_INFO, NRF_LOG_SEVERITY_INFO, __VA_ARGS__)
#define NRF_LOG_INTERNAL_MODULE(level,level_id,...) if (NRF_LOG_ENABLED && (NRF_LOG_LEVEL >= level) && (level <= NRF_LOG_DEFAULT_LEVEL)) { if (NRF_LOG_FILTER >= …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 I2S 麦克风 (Invensense ICS43432) 连接到运行 Arch Linux 的 Raspberry Pi (B+),但失败了。我已经在相关的 Arch Linux ARM 论坛中寻求了具体的建议,但我的问题实际上比这更笼统:如何调试 Linux 音频输入问题?
我已经使用逻辑分析仪验证了 I2S 麦克风正在正确的通道(左)和 Raspberry Pi 的正确引脚中发送敏感数据。I2S 麦克风在 ALSA 下显示为“声卡”。 arecord我非常高兴从该设备进行录音,并且我已将该设备的增益提高了alsamixer30 dB。然而记录文件的所有数据字节都是零。
在Linux下如何检查音频数据流、DMA操作?
我有一个包含 Javascript 的 HTML 页面,该页面旨在允许视频(在这种情况下实际上只是音频内容)在任何浏览器上使用 HTTP Live Streaming 播放。在大多数情况下,它使用,hls.js但在 Apple 产品的情况下,我需要做不同的事情,因为 Safari 具有本机 HLS 支持。
全文转载如下,但重要的几行是:
else if (video.canPlayType('application/vnd.apple.mpegurl')) {
video.src = 'music.m3u8';
video.addEventListener('canplay', startPlaying);
//document.addEventListener('DOMContentLoaded', startPlaying);
}
Run Code Online (Sandbox Code Playgroud)
应该发生的是,当canplay事件触发时,该startPlaying()函数被调用,这使得一个按钮可见,用户可以按下该按钮开始播放视频。但是,在我朋友的 iPhone 8plus (iOS 11.3.1) 上,这不起作用:没有任何按钮可见。相反,如果我注释掉该video.addEventListener()行并将其替换为该document.addEventListener()行,则一切正常:按钮可见,他可以播放流。
谁能发现我做错了什么?可能是一个新的错误,因为我对这个网络/脚本的东西不是很熟悉,让我流鼻血......当然,我可以将它留在 DOM 加载方法中,但这是不对的,我宁愿是对的.
<!DOCTYPE html PUBLIC "-//Netscape Comm. Corp.//DTD HTML//EN">
<html>
<script src="hls.js/dist/hls.js"></script>
<head><meta http-equiv="content-type" content="text/html; charset=UTF-8"></head>
<body>
<video id="video"></video>
<button id="play" hidden>Loading</button>
<script>
'use strict';
var video = document.getElementById('video');
var playButton = document.getElementById('play'); …Run Code Online (Sandbox Code Playgroud) 我有一组C函数,我需要在ARM目标,C++和C#中使用.我可以成功地将C包装成C++ DLL,然后成为C#DLL并使用我已成功绑定的所有C函数.但是,我有一个调试功能,我希望能够打印到C#GUI,它使用的委托是垃圾收集而不是留在原地.
托管调试助手'CallbackOnCollectedDelegate'在'C:\ utm\pc\utm_win32_app\bin\Debug\utm_win32_app.vshost.exe'中检测到问题.
附加信息:对类型为'utm_dll_wrapper_cs!MessageCodec.MessageCodec_dll + guiPrintToConsoleCallback :: Invoke'的垃圾回收委托进行了回调.这可能会导致应用程序崩溃,损坏和数据丢失.将委托传递给非托管代码时,托管应用程序必须将它们保持活动状态,直到确保它们永远不会被调用.
以下是使用和设置回调的C代码片段mp_guiPrintToConsole:
#ifdef WIN32
static void (* mp_guiPrintToConsole) (const char*) = NULL;
void logMsg (const char * pFormat, ...)
{
char buffer[MAX_DEBUG_MESSAGE_LEN];
va_list args;
va_start (args, pFormat);
vsnprintf (buffer, sizeof (buffer), pFormat, args);
va_end (args);
#ifdef WIN32
if (mp_guiPrintToConsole)
{
(*mp_guiPrintToConsole) (buffer);
}
#else
// Must be on ARM
printf (buffer);
#endif
}
void initDll (void (*guiPrintToConsole) (const char *))
{
#ifdef WIN32
mp_guiPrintToConsole = guiPrintToConsole;
// This is the …Run Code Online (Sandbox Code Playgroud) alsa ×1
c ×1
c# ×1
debugging ×1
delegates ×1
dma ×1
html5-video ×1
javascript ×1
linux ×1
macros ×1
raspberry-pi ×1
safari ×1
variadic ×1