对于我正在研究的项目,我必须通过I2C与多功能芯片通信.我可以通过I2C/dev/i2c-1接口从linux用户空间执行此操作.
但是,似乎司机正在同时与同一芯片通话.这导致我的I2C_SLAVE访问失败,其中错误的值为EBUSY.好吧 - 我可以通过ioctl I2C_SLAVE_FORCE覆盖它.我尝试过,它的确有效.我的命令到达芯片.
问题:这样做是否安全?我确信我写的地址范围永远不会被任何内核驱动程序访问.但是,我不确定强制I2C通信是否会混淆某些内部状态机左右.(我不是那样进入I2C,我只是使用它......)
供参考,硬件事实:
OS: Linux Architecture: TI OMAP3 3530 I2C-Chip: TWL4030 (does power, audio, usb and lots of other things..)
我正在进行一个嵌入式项目,我必须将超时值写入某个微芯片的两个字节寄存器.
超时定义为:
timeout = REG_a * (REG_b +1)
Run Code Online (Sandbox Code Playgroud)
我想使用256的范围内的整数来编程这些寄存器,比方说60000.我正在寻找一种算法,给定超时值,计算REG_a和REG_b.
如果不可能得到确切的解决方案,我希望得到下一个可能更大的超时值.
到目前为止我做了什么:
我目前的解决方案是:
temp = integer_square_root (timeout) +1;
REG_a = temp;
REG_b = temp-1;
Run Code Online (Sandbox Code Playgroud)
这导致在实践中有效的值.但是,我想看看你们是否可以提出更优化的解决方案.
哦,我受内存限制,所以大表是不可能的.运行时间也很重要,所以我不能简单地强制解决问题.
本质上,我有一个伽马探测器系统,每个探测器被分成4个晶体,如果只有2个晶体发生碰撞,我们可以确定该对晶体是垂直于还是平行于产生伽马射线的反应平面。在为此编写逻辑的过程中,我最后编写了一个庞大而丑陋的switch语句组合,这些语句在每个检测器中检查晶体编号的组合(在整个检测器及其晶体阵列中都是唯一的)。这是代码,包括相关功能。
//The Parallel and Perpendicular designations are used in addition to the Double
//designation for the 90 degree detectors if we get a diagonal scatter in those detectors
//then we use the Double designation
enum ScatterType{Single, Double, Triple, Quadruple, Parallel, Perpendicular};
ScatterType EventBuffer::checkDoubleGamma(int det)
{
int num1=evList[crysList[0]].crystalNum;
int num2=evList[crysList[1]].crystalNum;
switch(det)
{
case 10: //first of the 90 degree detectors
if( (num1==40 && num2==41) || //combo 1
(num1==41 && num2==40) || //combo 1 reverse
(num1==42 && num2==43) || //combo 2
(num1==43 …Run Code Online (Sandbox Code Playgroud) 我可以将一个函数声明为静态函数并在一行中使用extern"C"链接吗?
例如,通过GCC,我可以这样做:
extern "C" {
static void MyHandler (void)
{
// some code here
}
}
Run Code Online (Sandbox Code Playgroud)
它完全符合我的要求.
出于美学原因,我不喜欢外部的"C"{}块.
我也可以写:
extern "C" void MyHandler (void) { ...
Run Code Online (Sandbox Code Playgroud)
要么
static void MyHandler (void) { ...
Run Code Online (Sandbox Code Playgroud)
但如果我把它们结合起来,以下两个似乎都不起作用:
extern "C" static void MyHandler (void) {...
static extern "C" void MyHandler (void) {...
Run Code Online (Sandbox Code Playgroud)
问:有没有办法在不使用显式的外部"C"块的情况下组合两个连接修饰符?
假设我在3D空间中有两个点(a和b)以及一个名为n的固定轴/单位向量.
我想创建一个旋转矩阵,最小化点a(未旋转)和旋转点b之间的欧几里德距离.
例如:
Q := matrix_from_axis_and_angle (n, alpha);
find the unknown alpha that minimizes sqrt(|a - b*Q|)
Run Code Online (Sandbox Code Playgroud)
顺便说一句 - 如果使用单位四元数可以更容易地表达解决方案/算法并继续使用它们.我只是使用矩阵来表达我的问题,因为它们被更广泛地使用.
哦 - 我知道有一些退化的情况(a或b完全符合等等).这些可以忽略.我只是在寻找可以计算单个解决方案的情况.
我有一个由点数组确定的多边形。
该多边形自身相交,从而在多边形本身中产生了一些孔。
我的问题是:如何忽略这些孔并仅获取多边形的外部点?
还是会有什么相同,并且可能更简单:应该使用哪种算法检查点是否在多边形内,以将多边形孔中的点检测为内部点?
提前致谢,
/罗杰
我觉得需要速度.双循环正在破坏我的iPad应用程序性能.我需要SIMD.如何在iPad A4处理器上执行整数SIMD操作?
谢谢,
道格
我在线程中运行的 Linux 中有一个阻塞读取。
在程序关闭期间,我想使线程脱离此读取。不幸的是,我无法使用轮询或选择并编写正确的代码,因为读取的文件是不实现轮询/选择功能的设备驱动程序。
作为临时解决方案,我当前通过 pthread_kill 向线程发送 SIGUSR1 信号,并从处理程序调用 pthread_exit。这会杀死线程并到目前为止有效,但我对解决方案不满意,因为信号可能出现在任何地方,而不仅仅是在读取中。
Linux 上有什么机制可以中断阻塞读取吗?
顺便说一句 - 我尝试从不同的线程关闭文件句柄,希望这会产生某种 IO 错误。不幸的是这个简单的解决方案根本不起作用。
所以我提出了一个关于std :: reduce的问题,这引出了我的一个例子.cppreference.com
在这个例子中,我看到了以下std :: vector声明:
std::vector<double> v(10'000'007, 0.5);
Run Code Online (Sandbox Code Playgroud)
这些报价在这里做什么?我以前从未见过这个.这是我应该了解的一种新的C++特性吗?
我有一个大的整数列表(数千),我想从中提取第一个N(大约10-20)的唯一元素.列表中的每个整数大约出现三次.
编写一个算法来做这件事是微不足道的,但我想知道什么是速度和内存最有效的方法.
在我的案例中还有一些额外的约束和信息:
在我的用例中,我在数组上多次提取我的唯一身份,每次都从头开始跳过一些元素.在唯一提取期间,我跳过的元素数量是未知的.我甚至没有上限.因此排序不是速度效率的(我必须保持数组的顺序).
整数遍布整个地方,因此作为查找解决方案的位数组是不可行的.
我想不惜一切代价避免在搜索过程中进行临时分配.
我目前的解决方案大致如下:
int num_uniques = 0;
int uniques[16];
int startpos = 0;
while ((num_uniques != N) && (start_pos < array_length))
{
// a temporary used later.
int insert_position;
// Get next element.
int element = array[startpos++];
// check if the element exist. If the element is not found
// return the position where it could be inserted while keeping
// the array sorted.
if (!binary_search (uniques, element, num_uniques, &insert_position))
{
// insert the new unique …Run Code Online (Sandbox Code Playgroud) 来自一个C-guy的问题,他必须处理一些通过JNI连接到我的C代码的java代码.
我必须在构建系统上工作,我正在尝试将其从shell脚本更改为正确的makefile.对于容易的C部分,但java方面以某种方式涉及xdoclet的东西.
我还没有找到xdoclet的全部内容,我想了解一切.
我做了我的谷歌研究,但我不知道那是什么.对我来说,如果你已经熟悉这个问题并且你已经掌握了10年的java工作,那么你似乎只有机会理解官方文档.
你能不能 - 为假人 - 解释xdoclet的作用?
顺便说一句 - 我也提到过C.我也是面向对象编程的.没有必要向我解释类或继承的基础知识(如果需要理解xdoclet).
编辑:大约十年前我就问过这个问题.我仍然不知道xdoclet是什么,但这个问题超过了一千个观点.我想看到一些java家伙进入,最后清理一下.
我正在逐位计算CCITT CRC-16.我这样做是因为它是一个原型,以后应该移植到VHDL并最终在硬件中检查串行比特流.
在网上我发现了一位CRC-16更新步骤代码.写了一个测试程序,它的工作原理.除了一个奇怪的事情:我必须从最低位到最高位提供一个字节的位.如果我这样做,我会得到正确的结果.
在CRCITT的CCITT定义中,位应该是最高位到最低位.我想要计算CRC的数据流也是这种格式的,所以我现在的代码对我来说没什么用.
我糊涂了.我不希望以错误的方式喂食这些钻头可能会起作用.
问题:为什么可以编写CRC来以两个不同的位顺序获取数据,以及如何转换它首先接受数据MSB的单位更新代码?
作为参考,这是相关代码.已删除初始化和最终检查以保持示例简短:
typedef unsigned char bit;
void update_crc_single_bit (bit * crc, bit data)
{
// update CRC for a single bit:
bit temp[16];
int i;
temp[0] = data ^ crc[15];
temp[1] = crc[0];
temp[2] = crc[1];
temp[3] = crc[2];
temp[4] = crc[3];
temp[5] = data ^ crc[4] ^ crc[15];
temp[6] = crc[5];
temp[7] = crc[6];
temp[8] = crc[7];
temp[9] = crc[8];
temp[10] = crc[9];
temp[11] = crc[10];
temp[12] = data ^ crc[11] ^ crc[15];
temp[13] …Run Code Online (Sandbox Code Playgroud)