小编Joh*_*Doe的帖子

遍历 C 中的枚举?

假设我有几个在枚举中定义的硬件寄存器:

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)

c enums

7
推荐指数
1
解决办法
4380
查看次数

无硬件 I2C 驱动程序的单元测试 - 如何解释从机的正确值?

我有一个 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)

hardware unit-testing mocking i2c

5
推荐指数
0
解决办法
1113
查看次数

绕过警告:"控制变量未在循环内修改"

我有一个非常简单的函数,它创建了一个时间延迟:

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的规则:

c misra while-loop

5
推荐指数
1
解决办法
282
查看次数

Notepad ++:标记列直到文件结束

这是一个简单的问题,我在谷歌搜索,但没有找到任何有用的东西。

我知道 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)

notepad++

4
推荐指数
1
解决办法
5859
查看次数

在for循环中向数组添加元素

我想通过遍历一个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 …

c for-loop

2
推荐指数
1
解决办法
48
查看次数

使用||来检查长例语句的更快方法 条件

我有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毫秒在实时系统上执行一次。将有哪些(或没有任何一种)最快的方式来对照这些案例陈述?

c switch-statement

1
推荐指数
1
解决办法
47
查看次数

MISRA:在指向易失性对象的指针和整数类型之间进行转换?

我有以下代码部分:

----------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 消息“在指向易失性对象的指针和整数类型之间进行转换”。

知道如何避免此消息吗?

谢谢!

c casting misra

0
推荐指数
1
解决办法
3588
查看次数

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 警告。知道如何避免它们吗?

c misra

0
推荐指数
1
解决办法
332
查看次数

将列表块移动到新行

我创建了一个脚本,我在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')但它不起作用或我没有正确应用...

python

-1
推荐指数
1
解决办法
31
查看次数