标签: embedded-linux

如何在嵌入式Linux中高效地在VFAT分区上创建大文件

我试图在嵌入式Linux框中使用`dd'命令在VFAT分区上创建一个大的空文件:

dd if=/dev/zero of=/mnt/flash/file bs=1M count=1 seek=1023
Run Code Online (Sandbox Code Playgroud)

目的是跳过前1023个块并在文件末尾只写一个块,这在原生EXT3分区上应该非常快,而且确实如此.但是,此操作在VFAT分区上变得非常慢,并伴有以下消息:

lowmem_shrink:: nr_to_scan=128, gfp_mask=d0, other_free=6971, min_adj=16
// ... more `lowmem_shrink' messages
Run Code Online (Sandbox Code Playgroud)

另一种尝试是在VFAT分区上fopen()一个文件然后fseek()到最后写入数据,这也被证明是慢的,以及来自内核的相同消息.

基本上,有没有一种快速的方法在VFAT分区上创建文件(不遍历前1023块)?

谢谢.

linux filesystems file-io embedded-linux

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

在arm-linux中打印堆栈跟踪

我按照这篇文章打印堆栈跟踪如何在我的gcc C++应用程序崩溃时生成堆栈跟踪.它在x86 linux中运行良好.任何人都可以教我如何使它在arm-linux上运行?

我正在使用arm-linux-gcc 4.4.3.

[root@FriendlyARM /]# ./test1
Error: signal 11:
[0x0]
Run Code Online (Sandbox Code Playgroud)

在x86中

mickey@mickeyvm:~/Desktop/workspace/test/testCatchSeg/src$ ./test1
Error: signal 11:
./test1(_Z7handleri+0x19)[0x804876d]
[0xedd400]
./test1(_Z3bazv+0x10)[0x80487c2]
./test1(_Z3barv+0xb)[0x80487e1]
./test1(_Z3foov+0xb)[0x80487ee]
./test1(main+0x22)[0x8048812]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x84de37]
./test1[0x80486c1]
Run Code Online (Sandbox Code Playgroud)

这就是我为arm-linux编译的方法

 arm-linux-g++ -g -rdynamic ./testCatchSeg.cpp -o testCatchSeg
Run Code Online (Sandbox Code Playgroud)

c c++ arm embedded-linux

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

为什么在拔下USB电缆时选择返回?

我遇到一些linux c代码的问题,它使用select,FD_ISSET,read等从ttyUSB端口读取.我的调制解调器使用FTDI串口转USB电缆进行输入.问题是拔下USB电缆时选择取消阻止.有没有办法阻止它这样做?

count = 0;
while ( g_running ) {
   FD_ZERO(&readFdSet);
   maxfd = 0;
   numTransPorts = 0;
   logger( DEBUG, "Begin g_running loop - %d", count );
   for ( i = 0; i < MAX_CONFIG_PORTS; i++ ) {
      if ( configPorts[i].commType == 1 && configPorts[i].pttyHost != NULL ) {
         FD_SET( configPorts[i].pttyHost->fd, &readFdSet );
         logger( DEBUG, "FD_SET - fd=%d, index=%d", configPorts[i].pttyHost->fd, i );
         if ( configPorts[i].pttyHost->fd >= maxfd ) {
            maxfd = configPorts[i].pttyHost->fd;
         }
         numTransPorts++;
      }
   }
   maxfd++; // add one because …
Run Code Online (Sandbox Code Playgroud)

c usb embedded-linux

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

在用户空间ARM9嵌入式Linux AM1808中处理GPIO

我必须将我的GSM模块与基于ARM9的AM1808接口.

我已将所有GPIO引脚分配给Da850.c以及mux.h文件.我成功创建了一个uImage并将该图像插入到我的flash中.

我需要从User应用程序处理一些GPIO.

我知道我们可以从Kerel空间处理GPIO,但我需要从用户空间处理.

例如,我已经为GSM模块分配了GPIO电源键.我需要通过应用程序更改引脚装置(HIGH或LOW).

好的,我已经编写了以下代码来从用户空间访问它,

#include <stdio.h>
#include <time.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <unistd.h>
#include "GSMpwr.h"
#define BS_GSM_PWR_REGISTER 0x01E26014
#define BS_DCDS_MASK    0x00000004

int fd;  // Memory device descriptor
unsigned long *pPWR;

unsigned short GetGSMpwr(void)
{
    #if defined __HOST_ARM
    unsigned long dcd_value = *pPWR;
    return (pwr_value >> 7) & 0x01;
    #endif
}

void InitializeGSMpwr(void) 
{
    #if defined __HOST_ARM
    int page_size = getpagesize();
    unsigned int MAP_addr;
    unsigned int reg_addr;
    unsigned char *pTemp;             // Pointer to GSMpwr …
Run Code Online (Sandbox Code Playgroud)

embedded arm embedded-linux

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

linux上的mpc/mpd:如何播放本地wav文件

我试图将一个本地文件添加到mpd(通过mpc)并播放它.我的平台是OpenWRT嵌入式linux.

所以,从手册页中可以看出:

mpc add <file>   Add a song to the current playlist
Run Code Online (Sandbox Code Playgroud)

如果我做:

root@OpenWrt:~/.mpd# mpc add /usr/share/baresip/ring.wav 
error adding /usr/share/baresip/ring.wav: directory or file not found
Run Code Online (Sandbox Code Playgroud)

或者如果我这样做:

root@OpenWrt:~/.mpd# mpc add file:///usr/share/baresip/ring.wav 
error adding file:///usr/share/baresip/ring.wav: Access denied
Run Code Online (Sandbox Code Playgroud)

这里的语法究竟是什么?对于mpc/mpd,手册页真的不太清楚.

linux bash embedded-linux audio-player

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

简单的字符设备驱动程序

我写了一个简单的字符设备驱动程序,并希望将其交叉编译为craneboard(ARM体系结构).我的文件名是gDev.c.我将文件复制到kernel/drivers/char了起重机源中的目录.我修改了Kconfig同一目录中的文件并添加了以下行.

config TEST_GCHARD
    tristate "My Character driver"
    default m
Run Code Online (Sandbox Code Playgroud)

我将以下行添加到同一目录中的Makefile中.

obj-$(CONFIG_TEST_GCHARD)   += gDev.o
Run Code Online (Sandbox Code Playgroud)

我在am3517_crane_defconfigin arch/arm/configs目录中添加了以下行.

CONFIG_TEST_GCHARD=m
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我将它设置为mam3517_crane_defconfig,是没有得到包括编译的文件.但是,如果我改变它y,它就会被编译.但是,我需要它成为一个模块,我必须insmod在启动后启动它.请指导我是否缺少任何步骤.谢谢.

c linux driver linux-device-driver embedded-linux

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

U-boot.bin和uImage.bin有什么区别

u-boot.bin和之间感到困惑uImage.bin.我想uImage.bin只是压缩版本,u-boot.bin它的大小应该小于u-boot.bin.但是在我的构建环境中,我发现的是u-boot.bin尺寸小于uImage.bin.

有谁能让我知道u-boot.binuImage.bin?之间有什么区别?

linux linux-kernel embedded-linux u-boot

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

如何使用libnl库来触发nl80211命令?

请有人举一个关于如何使用libnl来使用nl80211的简单示例.我试图通过新的源代码,但它很混乱.任何人都可以给出一个关于如何使用libnl触发nl80211命令(如NL80211_CMD_GET_WIPHY)的简单程序.

network-programming embedded-linux wifi netlink

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

解释ARM(特别是移动)外设寻址和总线架构?

我首先要说的是,我不是该领域的专家,我的问题可能包含误解,在这种情况下,如果你纠正我并附上资源,我会很高兴,所以我可以了解更多细节.

我试图弄清楚系统总线的方式以及移动设备中出现的各种设备(如传感器芯片,wifi/BT SoC,触摸屏等)是如何被CPU(以及其他设备)处理的微控制器).

在PC世界中,我们有总线仲裁器将命令/数据路由到设备,并且,afaik,地址在板上硬连线(如果我错了,请纠正我).但是,在移动世界中,我没有找到任何类型寻址的证据; 我确实发现ARM已经标准化了高级微控制器总线架构,但我不知道,该标准是否适用于位于同一SoC(即Exynos,OMAP,Snapdragon等)内的组件(cpu-cores).或者也影响外围接口.具体来说,我问的是哪个组件负责为外围设备和MMIO地址分配地址?

一个更基本的问题是,在移动设备架构中是否存在总线管理,或者是否存在某种"星形"拓扑(以CPU为中心).

这个问题我得到的印象是这些设备被视为平台设备,即直接连接到CPU而不是通过总线连接的设备.不过,我的问题是操作系统如何知道如何解决它们?然后其他线程,这个这个有关平台的设备/驱动程序让我糊涂..

embedded arm embedded-linux amba

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

"scatterlist"如何在linux中运行?

正如我们所知,分散列表收集了物理上分散在内存中的内存,但实际上是连续的.当与DMA通信时,它为DMA提供了一个抽象的内存视图,因为这是物理上连续的内存.

怎么scatterlist处理这个?它是一种保持在内的链表scatterlist吗?

例如,如果要使用DMA传输4000字节的数据,因为数据在物理上是连续的,分散列表如何使其连续?scatterlist实现将使用分配4000字节的数据Kmalloc来确保它获得物理上连续的内存?还是会创建一个链表?

注意:这里我的查询不是关于SG表,而是关于单个分散列表

让我们说我们想要保存4000字节物理上不连续的内存的数据

struct scatterlist sg,
sg_init_one(&sg,data,4000)
Run Code Online (Sandbox Code Playgroud)

现在,这个sg如何解决这个问题?

c linux-device-driver linux-kernel embedded-linux dma

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