我正在为 AVR 芯片编写 C 代码。该代码在等待串行端口、ADC 和定时器的中断服务例程上很繁重。ISR 写入缓冲区,当主循环到达它们时会检查这些缓冲区。
我设计了缓冲区,以便 ISR 可以在主循环读取它们时更新它们。我想验证这是否有效。我有单元测试来验证基本操作,但我不清楚如何测试如果在主循环读取缓冲区时触发中断会发生什么。
我的单元测试非常基础——功能中的一些代码main()。我在我的 Linux 机器上运行测试。
我正在以编程方式生成音频.我听到缓冲区之间的沉默差距.当我将手机连接到示波器时,我发现每个缓冲区的前几个样本都丢失了,而它们的位置则是静音.这种沉默的长度从几乎没有变化到20毫秒.
我的第一个想法是我原来的回调函数需要花费太多时间.我用尽可能短的替换它 - 它反复重新排队相同的缓冲区.我观察到同样的行为.
AudioQueueRef aq;
AudioQueueBufferRef aq_buffer;
AudioStreamBasicDescription asbd;
void aq_callback (void *aqData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer) {
OSStatus s = AudioQueueEnqueueBuffer(aq, aq_buffer, 0, NULL);
}
void aq_init(void) {
OSStatus s;
asbd.mSampleRate = AUDIO_SAMPLES_PER_S;
asbd.mFormatID = kAudioFormatLinearPCM;
asbd.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
asbd.mBytesPerPacket = 1;
asbd.mFramesPerPacket = 1;
asbd.mBytesPerFrame = 1;
asbd.mChannelsPerFrame = 1;
asbd.mBitsPerChannel = 8;
asbd.mReserved = 0;
int PPM_PACKETS_PER_SECOND = 50;
// one buffer is as long as one PPM frame
int BUFFER_SIZE_BYTES = asbd.mSampleRate/PPM_PACKETS_PER_SECOND*asbd.mBytesPerFrame;
s …Run Code Online (Sandbox Code Playgroud) 我可能试图滥用预处理器.我想知道我的想法是否可能.
我的班级@properties都有相同的身体.我想用预处理器宏生成这些主体.例如:
- (float) accelerometerSensitivity {
return [dict floatForSelector:_cmd or:1];
}
- (void) setAccelerometerSensitivity:(float) n {
[dict setFloat:n forSelector:_cmd];
[dict writeToFile:[self globalDataFilename] atomically:YES];
}
- (float) returnSpringTension {
return [dict floatForSelector:_cmd or:0];
}
- (void) setReturnSpringTension:(float) n {
[dict setFloat:n forSelector:_cmd];
[dict writeToFile:[self globalDataFilename] atomically:YES];
}
// set*ForSelector methods are in a category on NSMutableDictionary and depend on a function that translates selectors into strings:
// NSString* keyFromSelector(SEL selector);
Run Code Online (Sandbox Code Playgroud)
我的想法是,不是使用字符串文字(或字符串常量)作为字典中的键,而是从选择器名称派生字符串.这样我确信密钥的拼写与属性名称匹配,并且基本上获得了字典密钥的编译时验证的好处.
我想要做的就是说出类似的内容SELECTOR_PROPERY(accelerometerSensitivity)并让它扩展到getter和setter中.我作为预处理器宏实现它的主要困难是从属性名称生成setter名称.我需要将属性名称的第一个字母大写,并且我不知道如何在预处理器中执行此操作.
我的具体上下文是 STM32 ARM M0,但问题更笼统。
读取或写入内存映射外设(例如 GPIO 端口或串行端口缓冲区)的内容与物理 RAM 中的位置是否需要相同数量的时钟?这是否因架构而异?
我觉得愚蠢地问这个问题,答案一定是盯着我看,但我不能马上用更广泛的谷歌搜索来找到它.
什么是匹配字母字符的Python正则表达式(不是数字)?我正在寻找相当于[A-Za-z]但支持Unicode的.
InterfaceBuilder在fooAppDelegate.m中为我生成了这个方法:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// Override point for customization after app launch
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];
}
Run Code Online (Sandbox Code Playgroud)
IB也放入UIWindow *window;fooAppDelegate.h和@synthesize window;fooAppDelegate.m,并相应地为navigationController.IB生成代码来释放window和navigationController在dealloc.
我看不到分配和初始化的任何代码window和navigationController.我想知道那会发生什么.
阿里.
我记得有一句话是这样的:
Unix 是通用虚拟机,C 是它的脚本语言。
我正在寻找这句话的来源和确切的语言。我依稀记得 Eric Raymond 是最接近的消息来源,但我在他的文章中找不到。
我正在寻找简单的方法将IMAP响应中出现的括号列表拆分为Python列表或元组.我想要离开
'(BODYSTRUCTURE ("text" "plain" ("charset" "ISO-8859-1") NIL NIL "quoted-printable" 1207 50 NIL NIL NIL NIL))'
Run Code Online (Sandbox Code Playgroud)
至
(BODYSTRUCTURE, ("text", "plain", ("charset", "ISO-8859-1"), None, None, "quoted-printable", 1207, 50, None, None, None, None))
Run Code Online (Sandbox Code Playgroud) Android View有三个版本invalidate():一个使整个视图无效,另外两个只使其中的一部分无效.但它只有一个onDraw(),它绘制整个画布.必须有一些使用系统的提示,我只想让视图的一部分无效,但我不清楚它是什么.
我有一个自定义绘图的视图onDraw().我有办法找出画布的哪些部分无效,所以我只画出那些?
我想初始化一个超类的子类之一的实例,具体取决于init的参数:
[[Vehicle alloc] initWithItinerary: shortWay]; // returns a bicycle
[[Vehicle alloc] initWithItinerary: longWay]; // returns a car
Run Code Online (Sandbox Code Playgroud)
我找不到这样的代码示例.我想知道这在目标C中是不是惯用的,或者我只是在寻找合适的位置.
我有一个add()对象进入LinkedList队列的线程,另一个线程是poll()要处理的对象的队列.这是我在队列中使用的唯一两种方法.我从不迭代队列,也不添加或删除列表中间的对象.当两个线程相互踩踏并以某种方式破坏数据时,我无法想到一个场景,但也许我的想象力根本就缺乏.
推送很少(每秒几次),但轮询非常频繁(每秒几千次).我想知道我为同步add()和获得了多少惩罚poll().这是在Android上运行的.
编辑:我不是在寻找BlockingQueue; 我在I/O上阻塞,而不是阻塞队列中的对象:
在run()上等待空间轮询的线程块的方法来在输出缓冲器变得可用.当空间可用时,它会查看是否有任何对象在队列中等待.如果有可用,则将其序列化为输出缓冲区.如果队列为空(即poll()返回null),则为poll()其他优先级较低的队列,如果全部为空,则序列化"无数据现在可用"消息.
我很好奇express用于将对象序列化为JSON的算法是什么,以及是否有修改它的方法.
我注意到它只序列化对象自己的属性,这使得发送从其他对象继承的对象变得困难.它还省略了任何值为的属性undefined.我理解,在功能上,省略它们与包含它们相同并节省带宽,但包括它们使得JSON更容易被人们阅读,因为它试图弄清楚如何使用API.
在任何情况下,这是一个更多关于如何表达事物而不是我的代码应该做什么的问题:=)
我需要做些什么来gcc包括gmtime_r(3)from 的声明time.h?看着/usr/include/time.h,gmtime_r并localtime_r都在里面#ifdef __USE_POSIX。
我是否需要执行一些__USE_POSIX操作(如命令行选项)?我现在一起跑步-std=c99。我了解__USE_*宏并非旨在由用户代码直接设置。
/* Return the `struct tm' representation of *TIMER
in Universal Coordinated Time (aka Greenwich Mean Time). */
extern struct tm *gmtime (const time_t *__timer) __THROW;
/* Return the `struct tm' representation
of *TIMER in the local timezone. */
extern struct tm *localtime (const time_t *__timer) __THROW;
#ifdef __USE_POSIX
/* Return the `struct tm' representation of *TIMER …Run Code Online (Sandbox Code Playgroud)