我将在我的开发板上启动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)
其他高级用法或语法对我来说并不熟悉.
看到下面的代码,我在另一个函数中定义了一个函数,
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中调用.
更重要的是,这种用法的常见场景是什么,或者这种用法用于什么?
我写了一个使用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正确地工作.我的问题是:
va_list/va_arg/va_start/va_end/va_arg不能用于printf64位整数和double/float?__builtin_va_start/__builtin_va_arg/__builtin_va_end/__builtin_va_list,为什么gcc会提示"未定义引用abort'"? But I can …我自己编译了busybox,然后将其放入嵌入式Linux中。但是我有一些疑问。
问题1:当我尝试使用诸如gzip之类的命令时,它会显示“ gzip:applet not found”。当我检查busybox的menuconfig时,请确保已选择“ gzip”。
问题2:我以前使用过VIM,但是busybox只提供VI。因此我将VIM链接到VI,但是当我输入vim并运行它时,它也显示“ vim:未找到applet”。
有人可以帮助我解决“找不到小程序”的问题吗?非常感谢你。
PS:我对busybox的“小程序”感到困惑,这是什么?像Java中的“小程序”一样?
我正在尝试使用 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) 我要在双核ARM Cortex-A9 CPU上运行一个操作系统(一个核心运行Linux,另一个运行没有操作系统).
在无操作系统方面,我们将64位double写入DDR内存,然后Linux端读取它.
由于CPU具有到DDR的32位总线,因此该值在两个总线周期内传输,这意味着如果写入和读取在总线上混合,则该值可能会被破坏.
我该怎么做才能让它以安全的方式运作?
正如主题所说,我得到了计算相同结构的同一操作的不同结果。结构如下。
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语言中的函数来初始化静态全局变量吗?例如:
static int var_01 = fun();
Run Code Online (Sandbox Code Playgroud)
当我在VC6中使用它时它成功了.但它在GCC 4.6.1中失败了.这很奇怪.我猜这种用法在C89中是非法的?或其他原因造成这种情况?