小编Ezi*_*zio的帖子

如何编写Linux .dts设备树文件?

我将在我的开发板上启动Linux,我需要一个dts文件(设备树文件)来描述整个硬件.但是我对这个文件的语法知之甚少,这还不足以在主板上正确运行Linux.

我现在知道的只是如何描述一个单元的中断号,频率,地址,父单元及其兼容的驱动程序类型(如下所述):

ps7_scuwdt_0: ps7-scuwdt@f8f00620 {
                        compatible = "xlnx,ps7-scuwdt-1.00.a";
                        device_type = "watchdog";
                        interrupt-parent = <&ps7_scugic_0>;
                        interrupts = < 1 14 769 >;
                        reg = < 0xf8f00620 0xe0 >;
                } ;
Run Code Online (Sandbox Code Playgroud)

其他高级用法或语法对我来说并不熟悉.

linux linux-kernel device-tree

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

为什么我可以在另一个函数中定义一个函数?

看到下面的代码,我在另一个函数中定义了一个函数,

void test1(void)
{
 void test2(void)
 {
   printf("test2\n");
 }
 printf("test1\n");
}

int main(void)
{
 test1();
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

这种用法很奇怪,是c89/c99的用法还是gcc的扩展(我在ubuntu 12编译时使用了gcc 4.6.3).我运行此代码并输出"test2"和"test1".test2只能在test1中调用.

更重要的是,这种用法的常见场景是什么,或者这种用法用于什么?

c c++ gcc

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

使用gcc编译一个显示"未定义引用`abort'"的项目

我写了一个使用va_list/va_arg/va_start/va_end/va_arg的printf myselef.

typedef char *va_list;
#define  _AUPBND                (sizeof (acpi_native_int) - 1)
#define  _ADNBND                (sizeof (acpi_native_int) - 1)
#define _bnd(X, bnd)            (((sizeof (X)) + (bnd)) & (~(bnd)))
#define va_arg(ap, T)           (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))
#define va_end(ap)              (void) 0
#define va_start(ap, A)         (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))
Run Code Online (Sandbox Code Playgroud)

首先,我从linux内核复制这些宏,printf可以打印32位整数正确但不能打印64位整数和打印double/float可能会失败或崩溃.然后我检查代码,我猜va_*可能有错误,所以我使用__builtin_va_*而不是内核的va_*.

typedef __builtin_va_list va_list;
#define va_start(v,l)   __builtin_va_start(v,l)
#define va_end(v)       __builtin_va_end(v)
#define va_arg(v,l)     __builtin_va_arg(v,l)
Run Code Online (Sandbox Code Playgroud)

但是gcc提示"未定义引用`abort'",所以我写了一个空的abort()和myprintf正确地工作.我的问题是:

  1. 为什么linux内核va_list/va_arg/va_start/va_end/va_arg不能用于printf64位整数和double/float?
  2. 当我使用时__builtin_va_start/__builtin_va_arg/__builtin_va_end/__builtin_va_list,为什么gcc会提示"未定义引用abort'"? But I can …

c linux printf variadic-functions

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

嵌入式Linux中的busybox显示“找不到小程序”

我自己编译了busybox,然后将其放入嵌入式Linux中。但是我有一些疑问。

问题1:当我尝试使用诸如gzip之类的命令时,它会显示“ gzip:applet not found”。当我检查busybox的menuconfig时,请确保已选择“ gzip”。

问题2:我以前使用过VIM,但是busybox只提供VI。因此我将VIM链接到VI,但是当我输入vim并运行它时,它也显示“ vim:未找到applet”。

有人可以帮助我解决“找不到小程序”的问题吗?非常感谢你。

PS:我对busybox的“小程序”感到困惑,这是什么?像Java中的“小程序”一样?

linux embedded ramdisk busybox

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

如何在 CMake 中使用特定的链接脚本(*.lds)?

我正在尝试使用 CMake 编写一个裸机程序(我的项目位于https://github.com/oska874/cmake_test)。演示源代码如下:

我的C

void mymain(void)
{
    int a=0;
    a++;
    a++;
}
Run Code Online (Sandbox Code Playgroud)

和链接脚本文件是:

我的.lds

ENTRY(mymain)
SECTIONS
{   
   . = 0x10000;
   .text : { *(.text) }
   . = 0x8000000;
   .data : { *(.data) }
   .bss : { *(.bss) }
}
Run Code Online (Sandbox Code Playgroud)

我可以用下面的命令编译它:

gcc -c my.c
ld -T my.lds -o my my.o
Run Code Online (Sandbox Code Playgroud)

但我不知道如何用 CMake 做同样的事情,因为 cmake 总是使用它自己的 .lds 脚本。

我尝试搜索 google 和 stackoverflow,但所有方法都失败了。

/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
Run Code Online (Sandbox Code Playgroud)

我试过 CMakeLists.txt 如下:

PROJECT(FreeRtos)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

set(CMAKE_EXE_LINKER_FLAGS_DEBUG " -T …
Run Code Online (Sandbox Code Playgroud)

c linux makefile cmake ld

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

确保一个cpu在另一个cpu读取"double"之前写了一个"double"?

我要在双核ARM Cortex-A9 CPU上运行一个操作系统(一个核心运行Linux,另一个运行没有操作系统).

在无操作系统方面,我们将64位double写入DDR内存,然后Linux端读取它.

由于CPU具有到DDR的32位总线,因此该值在两个总线周期内传输,这意味着如果写入和读取在总线上混合,则该值可能会被破坏.

我该怎么做才能让它以安全的方式运作?

c linux cpu assembly arm

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

为什么在具有相似版本gcc的X86和arm中,相同结构的大小计算不同?

正如主题所说,我得到了计算相同结构的同一操作的不同结果。结构如下。

struct test
{
  char m1;
  double d1;
}
Run Code Online (Sandbox Code Playgroud)

在Linux的gcc-4.6.3和gcc-4.2中使用sizeof(struct test)计算时,得到的结果为“ 12”。当我在Linux中使用gcc-4.6.1在WinXP中使用VC 6.0时,得到的结果为“ 16”。所以我很困惑,为什么会这样?GCC如何计算结构的大小?

添加:

如答案所示,arm linux需要AAPCS定义的8字节对齐,但是为什么x86中的vc 6.0会得到结果“ 16”?有人使用vc 2003或更高版本来计算吗?

C标准(例如C89 / C99)还定义了什么?

c linux gcc arm visual-c++

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

我可以通过调用C语言中的函数来初始化静态全局变量吗?

我可以通过调用C语言中的函数来初始化静态全局变量吗?例如:

static int var_01 = fun();
Run Code Online (Sandbox Code Playgroud)

当我在VC6中使用它时它成功了.但它在GCC 4.6.1中失败了.这很奇怪.我猜这种用法在C89中是非法的?或其他原因造成这种情况?

c static

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