- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对嵌入式平台上的 C 语言相当有经验,但我并没有在操作系统上使用 C 语言。我目前正在研究 Raspberry Pi 2。
我正在使用 C 语言工作,我需要制作一个实用程序来从二进制文件的一部分创建 CSV 文件。二进制文件包含许多小时的数据,并被格式化为一系列“ block ”,每个 block 包含约 2000 毫秒的数据。该程序是遍历每个 block 并拉取数据,直到到达结束时间。
当我尝试进行相对较小的二进制到 csv 的转换时,该程序可以正常工作,但没有理由不应该处理我可以识别的较大的转换。当我使用 MAX_TIME_SAMPLE_TO_CONVERT 运行程序到 180000 时,正常运行和 valgrind 都没有问题。当我将“MAX_TIME_SAMPLE_TO_CONVERT”更改为 200000 时,即出现段错误。这只需要 60kB 内存的 malloc,这应该是轻而易举的事。当我从命令行运行“免费”时,我有超过 500MB 的可用空间。
当我运行 valgrind 时,我得到了一个有点神秘的输出,但它告诉我遇到问题的行号(我正在使用 -g 选项构建)并且这些行号正是使用分配器:
/* save the samples into the arrays
* that will become the CSV files */
int32_t time = 0;
for(int j = 0; (j < numOfSamples) && (time < endTime); j++){
time = networkTime + (j * SAMPLE_INTERVAL_MS);
timeArray[sampleIndex] = time;
sampleArray[sampleIndex] = uncompressedBlockDataArray[j];
sampleIndex++;
}
完整代码:
int32_t startTime = getStartTime(argc, argv);
int32_t endTime = getEndTime(argc, argv);
/* calculate the amount of memory required to construct each array,
* limiting the maximum amount in order to conserve memory */
uint32_t timeWindow = endTime - startTime;
if(verbose)
printf("time window: %dms\n", timeWindow);
if(timeWindow > MAX_SAMPLE_TIME_TO_CONVERT){
timeWindow = MAX_SAMPLE_TIME_TO_CONVERT;
endTime = startTime + MAX_SAMPLE_TIME_TO_CONVERT;
if(verbose){
printf("warning: specified time window results in too many samples\n");
printf("\ttime window truncated to %dms\n", timeWindow);
printf("\tnew end time: %d\n", endTime);
}
}
uint32_t numOfSamples = timeWindow/SAMPLE_INTERVAL_MS;
if(verbose)
printf("each CSV file will contain up to %d samples (maximum of %dms)\n", numOfSamples, MAX_SAMPLE_TIME_TO_CONVERT);
/* allocate memory to temporarily store the
* data from the binary file as it is read */
int32_t *timeArray = (int32_t *)malloc(sizeof(uint32_t) * numOfSamples);
uint16_t *sampleArray= (uint16_t *)malloc(sizeof(uint16_t) * numOfSamples);
if(verbose)
printf("Allocating %d bytes for time and %d for samples\n", sizeof(uint32_t) * numOfSamples, sizeof(uint16_t) * numOfSamples);
if((timeArray == NULL) || (sampleArray == NULL)){
printf("Not enough RAM, exiting...\n");
return -1;
}
/* iterate through the SN array, saving each binary section to a CSV file */
for(int i = 0; serialNumbersToExport[i] > 0; i++){
uint32_t sampleIndex = 0;
if(verbose)
printf("\nAttempting binary-to-csv export of serial number %d...\n", serialNumbersToExport[i]);
/* create the source file paths */
char strSrcPath[DEFAULT_STR_LENGTH];
snprintf(strSrcPath, DEFAULT_STR_LENGTH, "/home/updsys/data/SN%d.ubin", serialNumbersToExport[i]);
if(verbose)
printf("\tAttempting to access '%s'...\n", strSrcPath);
/* open the source file */
FILE *sourceF;
sourceF = fopen(strSrcPath, "rb");
if(sourceF != NULL){
if(verbose)
printf("\tSource binary found, proceeding...\n");
/* find the starting point in the file, begin writing to the file
* until you reach the end of the file or the end time specified */
int32_t networkTime = 0;
uint32_t fileByteOffset = 0;
uint8_t blockHeaderArray[COMPRESSION_BLOCK_HEADER_LENGTH];
uint8_t blockDataArray[MAX_BLOCK_SIZE_IN_BYTES];
/* while time is less than end time OR we have reached the end of the file */
while(networkTime < endTime){
if(verbose)
printf("\tbinary file offset: %d\n", fileByteOffset);
fseek(sourceF, fileByteOffset, SEEK_SET); // set read pointer to beginning of file
/* when fread returns 0, break the loop */
if(fread(blockHeaderArray, 1, COMPRESSION_BLOCK_HEADER_LENGTH, sourceF) == 0)
break;
fileByteOffset += COMPRESSION_BLOCK_HEADER_LENGTH;
fseek(sourceF, fileByteOffset, SEEK_SET);
networkTime = (uint32_t)blockHeaderArray[0]
+ (((uint32_t)blockHeaderArray[1]) << 8)
+ (((uint32_t)blockHeaderArray[2]) << 16)
+ (((uint32_t)blockHeaderArray[3]) << 24);
uint16_t numOfSamples = blockHeaderArray[4];
uint16_t compressedWidth = blockHeaderArray[6];
uint16_t numBytesToRead = getBlockNumOfBytes16(compressedWidth, numOfSamples);
fread(blockDataArray, 1, numBytesToRead, sourceF);
fileByteOffset += numBytesToRead;
/* if the start time is less/equal to than the time at
* the end of the current block, then decompress and
* save the data */
int32_t timeAtEndOfBlock = networkTime + (int32_t)(numOfSamples * SAMPLE_INTERVAL_MS);
if(startTime <= timeAtEndOfBlock){
if(verbose)
printf("\tstart time (%d) within block end time (%d), decompressing...\n", startTime, timeAtEndOfBlock);
/* use to save single-block data to */
uint16_t uncompressedBlockDataArray[(MAX_BLOCK_SIZE_IN_BYTES/2)] = {0};
/* prepare to decompress */
CompressionDataStruct16 compressionDataStruct;
compressionDataStruct.sampleCount = numOfSamples;
compressionDataStruct.compressedWidth = compressedWidth;
compressionDataStruct.compressedData = blockDataArray;
compressionDataStruct.uncompressedData = uncompressedBlockDataArray;
decompressTo16(&compressionDataStruct);
/* save the samples into the arrays
* that will become the CSV files */
int32_t time = 0;
for(int j = 0; (j < numOfSamples) && (time < endTime); j++){
time = networkTime + (j * SAMPLE_INTERVAL_MS);
timeArray[sampleIndex] = time;
sampleArray[sampleIndex] = uncompressedBlockDataArray[j];
sampleIndex++;
}
}
}
if(verbose){
printf("\t%d samples found, closing source binary file...\n", sampleIndex);
}
fclose(sourceF);
/* if data was found, then write to CSV; otherwise move on */
if(sampleIndex > 0){
/* save the variables to '~/data/nodeNum.csv' */
char strDestPath[DEFAULT_STR_LENGTH];
snprintf(strDestPath, DEFAULT_STR_LENGTH, "/home/updsys/data/SN%d.csv", serialNumbersToExport[i]);
FILE *f;
f = fopen(strDestPath, "w"); // overwrite
for(uint16_t j = 0; j < sampleIndex; j++){
fprintf(f, "%d,%d\n", timeArray[j], sampleArray[j]);
}
fclose(f);
if(verbose){
printf("%d samples found, saving to %s\n", sampleIndex,strDestPath);
}
}else{
}
}else{
if(verbose)
printf("Source binary not found, moving on to next file...\n");
}
}
/* free the memory */
free(timeArray);
free(sampleArray);
if(verbose)
printf("\nfreeing memory...\n");
if(verbose)
printf("program execution complete\n");
最佳答案
sampleIndex
可以大于 numOfSamples
因为它在内部循环中没有重新初始化为 0 while(networkTime < endTime)
解决方案
确保sampleIndex
永远不会大于 numOfSamples
在你的内部 for 循环中。
关于C段故障 Raspberry Pi2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33507456/
我有一个运行 Raspbian 的 Raspberry Pi 1。我尝试在 Raspberry Pi 3 上运行 SD 卡,但它没有启动。 我已经阅读了有关升级 Raspberry Pi 2 安装以在
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我目前正在尝试RadiusNetworks发布的Raspberry Pi iBeacon教程,网址为 http://developer.radiusnetworks.com/2013/10/09/ho
我的公司使用 Raspberry Pi 3 作为产品中的嵌入式 Controller 。用户不会优雅地关闭它,他们只是扳动一个开关。为避免损坏,/boot 和/root 文件系统是只读的。这似乎是防弹
如何使用 Raspberry Pi 作为 b/w USB Tethered 手机和路由器的桥接器,使用“以太网电缆 b/w Raspberry Pi 和路由器”和“USB 电缆 b/w 手机和 Ras
我关注了一个名为Creating an Electron Application for the Raspberry Pi的博客,内容涉及使用Buster OS在Raspberry Pi中启动Elec
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我有一个树莓派,并且已经从 raspbmc.com 加载了最新的独立版本。在使用 XBMC 时,我看到 CPU 使用率始终在 90% 以上。查看 XBMC wiki 和常见问题解答后,脏区域似乎是减少
我现在正在做一个小项目。我希望 python 脚本在登录到 GUI 后自动运行。 我按照这里的步骤操作:https://www.raspberrypi.org/forums/view ... 91&t
我正在使用 Android Things 在 Raspberry Pi 上构建应用程序并且我有 7 inch touch screen ,但屏幕永远不会关闭。 是否可以像 Android 手机一样设置
我正在执行一组事件以确保 Redis 在一组嵌入式系统(包括 Raspberry PI)中运行良好。为了修复执行未对齐内存访问的 Redis 的某些代码路径(由于 Redis 3.2 中引入的更改),
我正在尝试使用 Tanuki Java Service Wrapper。 我使用的硬件是带有 Raspbian wheezy 发行版的 Raspberry Pi。 (见 http://www.rasp
我希望构建一个以全屏模式在 Raspberry Pi 上运行的应用程序。我已经尝试过 JavaFX 和基于 Swing 的应用程序,但性能非常糟糕。 在我开始使用 SDL( http://www.li
我的项目在/home/pi/app中 以npm start开头 启动操作系统后如何启动应用程序? ****西类牙文 Mi proyecto esta zh/home/pi/app Arranca la
我正在尝试安装 Kappelt gBridge在 Raspberry Pi 3 B 型上,使用本指南:https://doc.gbridge.io/selfHosted/hostItYourself.
我正在使用我的 Pi 作为文件服务器,最近当我登录时,我看到一条错误消息,指出 libarmmem.so(无法打开共享对象文件),尽管有一些建议运行 apt-get update + 升级它并没有带来
我正在尝试使用 Raspberry# 库通过 Raspberry PI 上的 GPIO 引脚(打开和关闭)执行基本任务。根据 github 上的示例:https://github.com/raspbe
如标题所述,我在将一些用户空间中断代码从另一个 armv7 嵌入式 linux 平台移植到 Raspberry Pi 2 Model B 时遇到问题。 我知道 wiringPi 库(并让它以这种方式工
我正在尝试为 Raspberry Pi B+ 交叉编译 Tensorflow-Lite。为此,我正在关注 these instructions来自官方网站,它们是: git clone https:/
我正在尝试使用 PulseAudio RTP 将音频从 Linux Mint 桌面流式传输到运行 LibreELEC (Kodi) 的 RaspberryPi 3B。我可以使用 RTP 多播成功地流式
我是一名优秀的程序员,十分优秀!