我正在开发 C 函数来使用以下方式关闭我的嵌入式 Linux 系统 (Ubuntu)。
#include <stdlib.h>
int main()
{
system("shutdown -P now");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这种方法安全吗?
如果没有,有没有更好更安全的方法可以执行相同的任务?
我正在为我的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源代码,并且使它符合MISRA。我收到与MISRA 2012规则13.3和13.2有关的以下错误:
增量/减量运算与其他具有副作用的运算[MISRA 2012 Rule 13.3,咨询] buf [count ++] = U1RXREG;
双方都有副作用[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 编写的模块。其中我的 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) 我正在使用 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) 我正在使用在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 ×5
c++ ×2
embedded ×2
misra ×2
execution ×1
googlemock ×1
googletest ×1
opencv ×1
qr-code ×1
time ×1
unit-testing ×1
zbar ×1