假设我有几个在枚举中定义的硬件寄存器:
typedef enum registers
{
REG1 = 0,
REG2 = 1,
REG3 = 2,
REG4 = 4,
REG5 = 6,
REG6 = 8,
REG_MAX,
}
Run Code Online (Sandbox Code Playgroud)
我有这些寄存器的默认值(实际上并没有决定以哪种方式定义它们,#define、array 或 enum...):
// This is just conceptual, not really an enum, array or #define :)
typedef enum values
{
VALUE_REG1 = A,
VALUE_REG2 = B,
VALUE_REG3 = C,
VALUE_REG4 = 53,
VALUE_REG5 = 88,
VALUE_REG6 = 24,
MAX_NUM_REG_VALUES
}
Run Code Online (Sandbox Code Playgroud)
我有一个可以读取硬件寄存器的函数:
uint8 readRegs(uint8 regaddr);
Run Code Online (Sandbox Code Playgroud)
现在我想循环遍历registers,并在每个元素上调用该readRegs()函数并将其与 enum 进行比较regvalues。看起来像:
registers regs; …Run Code Online (Sandbox Code Playgroud) 我有一个 i2c 驱动程序写入 i2c 总线:
从机(温度传感器)的寄存器地址
必须写入该地址的值
我还对该值进行检查(读回)以确保它是正确的。硬件上一切正常。我在循环环境和单元测试中使用软件,这样我就可以在没有硬件的情况下执行我的代码。为了能够从寄存器读回值,我必须“模拟”数据接收寄存器的内容(从 I2C 从机读回的值)。
因为,我对低级编程不是很有经验,知道在我的情况下如何做到这一点吗?
这是代码片段:
typedef struct
uint8 address; // The register address of the slave
uint8 value; //The value which have to be writte into the register
} MessageStruct;
MessageStruct *pMessage
uint8 Readback = 0;
Write_Toc_I2C( pMessage->address, pMessage->value ); // Function which writes to ic2 bus. For definition see below.
Readback = Read_From_I2c( pMessage->address); // I store the read back value in a variable Readback. Declaration of Read_From_I2c() below
if( Readback == …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的函数,它创建了一个时间延迟:
void delay(int time_in_ms)
{
int t = get_time() + time_in_ms;
while (get_time() < t)
{
};
}
delay(750);
Run Code Online (Sandbox Code Playgroud)
我收到警告,控制变量t未在while循环内修改.我不需要修改变量,只要条件满足,我只需要在while循环中.如何以"好"的方式绕过这个?
警告由MISRA静态分析工具创建.完整的信息:
"此循环结构中的控制变量永远不会被修改"
MISRA C:2012适用于消息2467的规则:
这是一个简单的问题,我在谷歌搜索,但没有找到任何有用的东西。
我知道 Notepad++ 中的列模式(Alt+ 鼠标左键单击或使用箭头)。如果我只有一些列,这是可以的,但是我有一个大约 10 000 行的文件,我想说记事本标记特定列直到文件结束。
这该怎么做?
该文件如下所示:
0 2942843527 0 1 Fr 0x237 3 00 00 10 02 00 00 00
1 2942843813 286 1 Fr 0x237 3 45 1C 90 33 EA 75 29 7B
2 2942844067 254 1 Fr 0x237 3 D4 8C 96 2C 01 FD 27 B7
3 2942844321 254 1 Fr 0x237 3 34 2C FC F2 DD 31 69 76
4 2942844575 254 1 Fr 0x237 3 91 8C …Run Code Online (Sandbox Code Playgroud) 我想通过遍历一个for循环来填充数组。
假设我有:
int8 myArray[30] = {0}; // Declaring and initializing an array which contains maximum 30 elements
Run Code Online (Sandbox Code Playgroud)
在for循环中向数组添加元素:
for (i = 0; i<5; i++)
{
myArray[0+(i*5)] = getNumberfromFunction1();
myArray[1+(i*5)] = getNumberfromFunction2();
myArray[2+(i*5)] = getNumberfromFunction3();
myArray[3+(i*5)] = getNumberfromFunction4();
myArray[4+(i*5)] = getNumberfromFunction5();
myArray[5+(i*5)] = getNumberfromFunction6();
}
Run Code Online (Sandbox Code Playgroud)
循环的每个元素应按以下方式填充:
myArray [0] = getNumberfromFunction1();
myArray [1] = getNumberFromFunction2();
...
...
myArray [5] = getNumberFromFunction6();
myArray [6] = getNumberFromFunction1();
....
....
i = 0的第一圈,索引正确:
myArray[0] = ..
myArray[1] = ..
..
..
myArray[5] = ..
Run Code Online (Sandbox Code Playgroud)
当i …
我有5个案例的切换案例陈述。这5种情况之一是:
switch (Number)
{
case 1:
CallSomeFunction1();
break;
case 3:
CallSomeFunction3();
break;
case 4:
CallSomeFunction4();
break;
case (2 || 7 || 8 || 9 || 12 || 14 || 18 || 19 || 22 || 23 || 25):
CallSomeFunction();
break;
case 6:
CallSomeFunction6();
break;
}
Run Code Online (Sandbox Code Playgroud)
切换情况每10毫秒在实时系统上执行一次。将有哪些(或没有任何一种)最快的方式来对照这些案例陈述?
我有以下代码部分:
----------header---------------------
typedef volatile struct REG_Base{
a;
b;
}REG_t
#define address (0xFFF45556)
------------------------------------
--------Source-----------------------
LOCAL REG_t *pToREG;
pToREG= (REG_t *) address;
-------------------------------------
Run Code Online (Sandbox Code Playgroud)
我在最后一行看到了 MISRA 消息“在指向易失性对象的指针和整数类型之间进行转换”。
知道如何避免此消息吗?
谢谢!
剪下我的代码:
uint16 myArray_A[5];
uint8 myArray_B[10] = {0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x10};
uint8 idx = 0;
for (idx= 0; idx< 5; idx++)
{
myArray_A[idx] = ((myArray_B[idx *2]<<8) | myArray_B[((idx++ *2)+1)]);
}
Run Code Online (Sandbox Code Playgroud)
该代码到目前为止有效。但是我从这个主题中得到了 MISRA 警告。知道如何避免它们吗?
我创建了一个脚本,我在List中生成2个元素的块:
chunks = data[x:x+2]
for x in xrange(0, len(data)2)]
outfile.write(str(chunks))
Run Code Online (Sandbox Code Playgroud)
这会生成一个包含2个元素的块的列表:
[[' 0x10', ' 0x00'], [' 0x02', ' 0x11'], [' 0x00', ' 0x04'], [' 0xFF', ' 0x01'], [' 0x00', ' 0x05'], [' 0x22', ' 0x00'], [' 0x10', ' 0x28']]
Run Code Online (Sandbox Code Playgroud)
我想以下列方式得到结果:
[0x10, 0x00]
[0x02, 0x11]
[0x00, 0x04]
[0xFF, 0x01]
Run Code Online (Sandbox Code Playgroud)
每个块都必须在一个新的行上.如何在新线上移动每个块?我已尝试使用替换.(',','\n')但它不起作用或我没有正确应用...