我有一个设备树文件(.dts),我想为我的powerpc基板编译文件.
我怎样才能在我的机器上进行,这不是基于powerpc的?我可以使用我的Ubuntu系统上安装的DTC吗?或者更像是使用单独的编译器并传递ARCH信息(比如使用工具链)?
powerpc cross-compiling linux-kernel embedded-linux device-tree
我正在尝试在我的intel x86主机上为ARM体系结构交叉编译helloworld内核(2.6.x)模块.
ARM的代码源工具链位于:/ home/ravi/workspace/hawk/arm-2009q3
内核源代码位于:/ home/ravi/workspace/hawk/linux-omapl1
我的Makefile:
ARCH=arm
CROSS_COMPILE=arm-none-linux-gnueabi
obj-m := Hello.o
KDIR := /home/ravi/workspace/hawk/linux-omapl1
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)
当我运行make时,.ko生成的是我的主机,这意味着makefile正在调用本机编译器而不是交叉编译器.我做错了什么?交叉编译器的二进制文件在我的路径中.
makefile cross-compiling kernel-module embedded-linux linux-toolchain
我正在寻找一个PWM驱动程序.我知道有两种方法可以控制硬件驱动程序:
如果一般(不考虑PWM驱动程序的情况),我们必须决定是去用户空间还是内核空间驱动程序.那么除了这些因素我们还要考虑哪些因素?
我正在尝试编写一个用于在Beaglebone上闪烁LED的C程序.我知道我可以使用sysfs方式......但是我想看看是否可以使用/ dev/mem获得与物理地址空间映射相同的结果.
我有一个头文件,beaglebone_gpio.h,内容如下:
#ifndef _BEAGLEBONE_GPIO_H_
#define _BEAGLEBONE_GPIO_H_
#define GPIO1_START_ADDR 0x4804C000
#define GPIO1_END_ADDR 0x4804DFFF
#define GPIO1_SIZE (GPIO1_END_ADDR - GPIO1_START_ADDR)
#define GPIO_OE 0x134
#define GPIO_SETDATAOUT 0x194
#define GPIO_CLEARDATAOUT 0x190
#define USR0_LED (1<<21)
#define USR1_LED (1<<22)
#define USR2_LED (1<<23)
#define USR3_LED (1<<24)
#endif
Run Code Online (Sandbox Code Playgroud)
然后我有我的C程序,gpiotest.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "beaglebone_gpio.h"
int main(int argc, char *argv[]) {
volatile void *gpio_addr = NULL;
volatile unsigned int *gpio_oe_addr = NULL;
volatile unsigned int *gpio_setdataout_addr = NULL;
volatile unsigned int *gpio_cleardataout_addr …Run Code Online (Sandbox Code Playgroud) 我在检测哪个块设备是硬盘时遇到问题.我的系统有一个CD-ROM驱动器,USB驱动器和一个未知供应商/类型的单个硬盘驱动器.
如何使用linux命令,脚本或C应用程序识别硬盘?
我正在尝试编写一个bash shell脚本,该脚本在用户定义的时间内在嵌入式设备上消耗大量RAM.如何在不使用数组的情况下执行此操作?
我想学习嵌入式linux的基础知识.要做到这一点,我假设我需要购买某种硬件板并拥有linux内核代码.
我不知道从哪里开始这个,任何提示/指针都是最受欢迎的.理想情况下,我希望人们指出一个完整的系统(例如这个"带有linux的电路板套件",这些"手册"非常好).
成本也是一个因素,因为我个人而不是作为一个企业:)
非常感谢Code
描述
我正在研究一个在多核ARMv7a SoC上运行的嵌入式Linux系统(使用内核3.4和仿生,类似Android).我们有一个用户空间线程,它基本上处理来自内核的事件.事件是从IRQ生成的,必须以非常低的延迟对用户空间做出反应.
线程以SCHED_FIFO优先级0运行.它是系统中唯一的优先级0线程.线程的近似代码:
while (1)
{
struct pollfd fds[1];
fds[0].fd = fd;
fds[0].events = POLLIN|POLLRDNORM|POLLPRI;
int ret = poll(fds, 1, reallyLongTimeout);
FTRACE("poll() exit");
if (ret > 0)
{
// notify worker threads of pending events
}
}
Run Code Online (Sandbox Code Playgroud)
通常我们会得到非常好的延迟(线程在IRQ发生的同一毫秒内完全往返于poll()),然而随机我们有几十毫秒的延迟会破坏一切.在遍历整个地方之后,我得出结论,延迟发生在IRQ触发之后和poll()系统调用返回之前,因为线程使自己处于睡眠状态.然后一段时间后被一些未知的力量唤醒,一切都继续.
我怀疑其他一些IRQ但是在启用了sched:,irq : , timer:*tracing我不得不排除它.我在移植系统调用时遇到了一些困难:*跟踪器到ARM内核.系统调用跟踪器工作,但如果我也启用sched:*我在ring_buffer代码中得到各种各样的恐慌.
在sys_poll()中插入一些自定义跟踪点之后,我得到了一个令人不舒服的结论,即我的线程在sys_poll()返回之后但在它重新出现在用户空间之前就已经睡着了.
这是带有我在fs/select.c中的自定义跟踪点的带注释的跟踪:
<my thread>-915 [001] ...1 17.589394: custom: do_poll:786 - calling do_pollfd
<my thread>-915 [001] ...1 17.589399: custom: do_poll:794 - failed, no events
<my thread>-915 [001] ...1 17.589402: custom: do_poll:823 - going to sleep, count = …Run Code Online (Sandbox Code Playgroud) multithreading multicore linux-kernel embedded-linux low-latency
我正在研究编写嵌入式Linux驱动程序,并决定开发一些GPIO以确保我正确理解本书(LDD3,第9.4.1节).
我可以按照预期控制正确的GPIO引脚(使其高低,我用万用表探测); 但是,我测试了2个代码,一个有request_mem_region(),一个没有.我期待一个没有失败的人,但两个都工作得很好.
代码request_mem_region:
if( request_mem_region( PIN3_CONF_PHYS, MAPPED_SIZE_GPIO_CONF,DEVICE_NAME ) == NULL )
{
printk( KERN_ALERT
"GPIO_140_141_conf_phys error:%s: unable to obtain I/O memory address 0x%08llX\n",
DEVICE_NAME, PIN3_CONF_PHYS );
return -EBUSY;
}
pin3_conf = (u32)ioremap( PIN3_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin4_conf = (u32)ioremap( PIN4_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin5_conf = (u32)ioremap( PIN5_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
pin6_conf = (u32)ioremap( PIN6_CONF_PHYS, MAPPED_SIZE_GPIO_CONF);
//-----------------------------------------------------------------
if( request_mem_region( GPIO_BANK5_PHYS, MAPPED_SIZE_GPIO_5,DEVICE_NAME ) == NULL )
{
printk( KERN_ALERT
"error:%s: unable to obtain I/O memory address 0x%08llX\n",
DEVICE_NAME, GPIO_BANK5_PHYS );
return …Run Code Online (Sandbox Code Playgroud) 在3238嵌入式Linux(ARMLinux)的C代码中处理时间的正确方法是什么,以确保代码在2038年1月19日03:14:07 UTC之后继续正常工作(当有符号的32位time_t溢出时)?鉴于time_t在我必须使用的系统上签名32位,有哪些替代方案?
大量的谷歌搜索没有发现任何实际用途.每个人似乎都认为到那时我们都将使用64位操作系统,但这显然不适用于嵌入式系统.
在我需要使用的系统上,__kernel_time_t定义为a long.这可能意味着64位时间没有内核工具.uClibc的版本是0.9.29.
我不敢相信我是唯一有这个问题的人,我不想重新发明轮子.
embedded-linux ×10
linux-kernel ×6
linux ×3
c ×2
32-bit ×1
bash ×1
device-tree ×1
embedded ×1
gpio ×1
low-latency ×1
makefile ×1
mmap ×1
multicore ×1
powerpc ×1
shell ×1
starter-kits ×1
uclibc ×1
year2038 ×1