我正试图在Cortex M4上分析一个C函数(从一个中断调用,但我可以在其他地方提取它并将其分析).
有多少可能计算此功能中通常使用的循环次数?功能应该在大约4000个周期内运行,所以我认为RTC不是一个选项,并且从反汇编中手动计算周期可能很痛苦 - 只有平均才有用,因为我想在具有典型闪存/内存的典型流上进行分析使用模式.
我听说过循环计数器寄存器和MRC指令,但它们似乎可用于A8/11.我还没有在cortex-Mx micros中看到过这样的说明.
我有一个系统,它通过http(> 10k生产者,每天10个日志,每个约100行文本)从不同的地方接收日志文件.
我想存储它们以便能够计算misc.每晚统计它们,出口它们(按到达日期或第一行内容排序)......
我的问题是:存储它们的最佳方法是什么?
有什么建议?
我想在na单个静态C程序中包含一堆数据(比如图像,还有其他数据,嵌入在可执行文件中,因为我在没有文件的嵌入式平台上工作).
因此,我写了一些img2c从我的数据文件中创建const数据,创建一个带有静态const数组初始化器的文件放到flash中(使用C99很棒的功能)
我的问题是,我应该将它们放在.h文件中,就像我多次看到的那样 - 例如gimp可以保存为.h文件,而不是.c文件 - 或者在.c文件中,仅在标题中引用const extern声明进一步引用,不必包含所有数据并将其全部传递给编译器,并在每次使用它时重新声明它?
预处理器宏是不可能的,因为我将引用它们的地址,而不是每次都包含整个数据.
我正在研究STM32F4 CPU上的一个项目,产生信号.
我在STM32上有CPU时钟(没有预分频器)的通用定时器,在溢出时触发中断,然后用GPIO产生周期信号.
我需要在非常精确的时间触发GPIO(基本上低至一个CPU周期精度).通过设置优先级等,我已设法将此抖动减少到+ -5个周期,但这种抖动存在,具体取决于CPU的工作情况.
我需要补偿这几个周期的抖动.只要我在精确的时间切换GPIO,添加几个周期的延迟就不是问题.
我的想法是读取计数器的当前值,并有一个FIXED_NUMBER-CURRENT_VALUE时间的活动循环,确保我将在精确的时间退出循环.
然而,在C中做一个简单的循环 - 一个FOR循环,或一个while(counter-> value <TARGET)不起作用,因为它ADDS抖动而不是减少它.
我做错了什么/天真吗?我应该在集会中这样做吗?怎么会与C不同(我检查了用GCC反汇编来检查循环没有被优化掉,也不是我打了内存?)
(我确保空的,非优化的但不打击内存循环体)
编辑:在AVR上看到这个例子(我知道的更稳定)请参见示例http://lucidscience.com/pro-vga%20video%20generator-7.aspx (搜索"jitter")
edit2:我在汇编中尝试了一个简单的循环,例如(r0是我的计数器,等待的循环次数,在寄存器中)
loop : SUBS r0,#1 ; tried with 2 also
BGE loop
Run Code Online (Sandbox Code Playgroud)
而且,如果没有它,抖动会更好.
总结起来,我已经知道我应该拖延多少.我只需要一种方法让代码分支在一个案例中可靠地消耗N个循环而在另一个案例中可以消耗M. 不幸的是,单独的分支似乎不起作用,因为管道填充似乎不需要可靠的循环次数,并且条件表达式也不会因为它们总是采用相同数量的循环(有时无效).
从RAM而不是闪存运行会提高一致性吗?(NB stm32f4有一个flash预取..)
我想HashMap一一处理这些值,同时可能会删除其中的一些值。
例如,我想做一个相当于:
use std::collections::HashMap;
fn example() {
let mut to_process = HashMap::new();
to_process.insert(1, true);
loop {
// get an arbitrary element
let ans = to_process.iter().next().clone(); // get an item from the hash
match ans {
Some((k, v)) => {
if condition(&k,&v) {
to_process.remove(&k);
}
}
None => break, // work finished
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这无法编译:
error[E0502]: cannot borrow `to_process` as mutable because it is also borrowed as immutable
--> src/lib.rs:12:17
|
9 | let ans = to_process.iter().next().clone();
| …Run Code Online (Sandbox Code Playgroud)