小编raj*_*123的帖子

C函数关闭linux系统

我正在开发 C 函数来使用以下方式关闭我的嵌入式 Linux 系统 (Ubuntu)。

#include <stdlib.h>

int main() 
{
    system("shutdown -P now");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这种方法安全吗?
如果没有,有没有更好更安全的方法可以执行相同的任务?

c embedded-linux

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

如何获得C程序的执行时间?

我正在为我的C程序使用时钟功能来打印当前程序的执行时间。我在输出中得到的时间是错误的。我想以秒,毫秒和微秒为单位显示时间。

#include <stdio.h> 
#include <unistd.h>
#include <time.h> 
int main() 
{ 
    clock_t start = clock(); 
    sleep(3);
    clock_t end = clock(); 
    double time_taken = (double)(end - start)/CLOCKS_PER_SEC; // in seconds 

    printf("time program took %f seconds to execute \n", time_taken); 
    return 0; 
} 


time ./time
time program took 0.081000 seconds to execute
real    0m3.002s
user    0m0.000s
sys     0m0.002s
Run Code Online (Sandbox Code Playgroud)

我希望输出大约3秒,但是显示错误。如您所见,如果我使用Linux命令时间运行该程序,我将得到正确的时间,我想使用我的c程序显示相同的时间。

c time execution

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

如何为C代码解决MISRA C:2012规则13.2和13.3?

我有C源代码,并且使它符合MISRA。我收到与MISRA 2012规则13.3和13.2有关的以下错误:

  1. 增量/减量运算与其他具有副作用的运算[MISRA 2012 Rule 13.3,咨询] buf [count ++] = U1RXREG;

  2. 双方都有副作用[MISRA 2012规则1.3,必填],[MISRA 2012规则13.2,必填] buf [count] = U1RXREG;

问题1的源代码

 void UART_call(void)
 {
    if(count < BUF_SIZE)
    {
        buf[count++] = U1RXREG;
        Flag = 1;
    }
    else
    {
        count = 0;
        Flag = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

解决了问题1代码的13.3错误后,我遇到了MISRA 1.3和13.2错误。问题2的源代码

void UART_call(void)
 {
    if(count < BUF_SIZE)
    {
        buf[count] = U1RXREG;
        count = count + 1U;
        Flag = 1;
    }
    else
    {
        count = 0;
        Flag = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

c embedded misra

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

如何在运行时使用 GoogleMock 在 C++ 单元测试中模拟系统调用?

我有一个用 C 编写的模块。其中我的 API 定义如下。

int ReadData(void* data, int data_size, char* filename, int offset)
Run Code Online (Sandbox Code Playgroud)

在执行单元测试以覆盖完整覆盖范围时,我需要遇到 fseek 和 fread 系统调用的错误条件。有人可以解释一下我如何在特定测试用例期间重写 fseek/fread ,以便它不会为该测试用例调用模拟 fseek/fread ,而不是系统调用?

ReadAPI.c
Run Code Online (Sandbox Code Playgroud)
#include<stdio.h>
#include<stdlib.h>

int readdata(void* data,int size, int offset, char* filename)
{
    if(data == NULL || size == 0 || filename == NULL)
    {
        return -1;
    }

    FILE* fp = fopen(filename,"rb");
    if(fp == NULL)
    {
        return -1;
    }

    if(fseek(fp,offset,SEEK_SET) != 0)
    {
        fclose(fp);
        return -1;
    }

    fread(data,size,1,fp);

    if(ferror(fp))
    {
        fclose(fp);
        return -1;
    }   
    fclose(fp);
    return 1;
} …
Run Code Online (Sandbox Code Playgroud)

c c++ unit-testing googletest googlemock

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

如何配置 C++ Zbar 扫描仪只解码二维码数据类型?

我正在使用 Zbar C++ 库来解码 QRCode,使用本教程:https ://www.learnopencv.com/barcode-and-qr-code-scanner-using-zbar-and-opencv/

在这里,我只需要从图像中解码 QRCode,但是使用本教程它可以从图像中解码 QRcode 和条形码。

在教程中它说只解码 QRCode 我们必须正确配置 Zbar Imagescanner。

在教程中,他们使用以下配置来解码二维码和条形码 ImageScanner scanner; scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);

所以只解码 QRCode 我使用以下配置: ImageScanner scanner; scanner.set_config(ZBAR_QRCODE, ZBAR_CFG_ENABLE, 1);

但是使用这个 Zbar 配置仍然可以解码 QRCode 和条形码数据。我得到的解码数据类型为 EAN-13 和 QR-Code。

如何正确配置 Zbar 扫描仪,使其仅解码二维码数据类型?

//Reference:https://www.learnopencv.com/opencv-qr-code-scanner-c-and-python/

#include <iostream>
#include <algorithm>
#include <vector>
#include <zbar.h>

#include <opencv2/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;
using namespace zbar;

typedef struct
{
  string type;
  string data;
  vector <Point> location;
}decodedObject;

// Find and decode …
Run Code Online (Sandbox Code Playgroud)

c++ opencv qr-code zbar

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

如何解决有关memcpy功能的MISRA C:2012错误?

我正在使用在string.h文件中声明的标准memcpy函数:

extern void *   memcpy(void *, const void *, size_t);
Run Code Online (Sandbox Code Playgroud)

案例1:我的代码编译时没有任何错误或警告.

const uint8_t *buff = (uint8_t*)Getbuff();
uint8_t data[3] = {0};
memcpy((void*)data,(const void*)(buff+2),3U);
Run Code Online (Sandbox Code Playgroud)

检查MISRA C:2012后,我收到MISRA错误:

通过添加执行指针算法[MISRA 2012规则18.4,咨询] memcpy((void*)data,(const void*)(buff+2),3U);

案例2:如果我在案例1中修复了MISRA错误:

const uint8_t *buff = (uint8_t*)Getbuff();
uint8_t data[3] = {0};
memcpy((void*)data,(const void*)(buff[2]),3U);
Run Code Online (Sandbox Code Playgroud)

我收到编译时警告和不同的MISRA错误.

编译时间警告:

cast to pointer from integer of different size
Run Code Online (Sandbox Code Playgroud)

MISRA错误:

'const UINT8'(又名'const unsigned char')到 'const void *'[MISRA 2012规则11.6,要求]的明确演员表memcpy((void*)data,(const void*)(buffer[2]),3U);

c embedded misra

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