DNA图谱 / 问答 / 问答详情

如何在Windows下构建ARM Linux QT开发环境

2023-07-26 09:16:33
TAG: win AR
共1条回复
阿里阿涅德
准备工作:
首先,最不可思议的,是要在Linux下把QT编译一遍,因为库都是一样的,需要的就是一些Windows下的qmake、moc、uic之类的工具而已。因为QT源码很多地方不能在Windows下面交叉编译通过,虽然我改了一些代码和配置(一会儿我贴出补丁来),但我只用它编译了qtbase、qtdeclarative这两个模块和qttools模块中的一部分。
Linux下的编译可以参照我之前写的这篇文章。参考配置:
开发包:
./configure -extprefix /opt/qt/5.2.1/arm -prefix /usr -plugindir /usr/lib/qt/plugins -importdir /usr/lib/qt/imports -qmldir /usr/lib/qt/qml -make libs -xplatform linux-arm-gnueabi-g++ -opengl es2 -confirm-license -opensource -xcb -xinput2 -nomake examples -nomake tests -qt-zlib -qt-xcb -dbus -largefile -cups -no-fontconfig -glib -gtkstyle -qt-freetype -sysroot /opt/sysroot-arm -mysql_config /opt/sysroot-arm/usr/bin/mysql_config -v
运行库:
./configure -prefix /usr -plugindir /usr/lib/qt/plugins -importdir /usr/lib/qt/imports -qmldir /usr/lib/qt/qml -make libs -xplatform linux-arm-gnueabi-g++ -opengl es2 -confirm-license -opensource -xcb -xinput2 -nomake examples -nomake tests -qt-zlib -qt-xcb -dbus -largefile -cups -no-fontconfig -glib -gtkstyle -qt-freetype -sysroot /opt/sysroot-arm -mysql_config /opt/sysroot-arm/usr/bin/mysql_config -v
做完这一步,你获得两样东西,sysroot和linux下的ARM QT开发文件。sysroot是编译QT之前,用Buildroot做的开发用根目录。这两个东西都要拷贝到Windows里,因为Windows不支持符号连接,拷贝需要需要去掉这些连接,这么做:
cp [源目录] [目标目录] -Lr
第二,需要一个Windows下模拟Linux环境的东西和编译器,我用的是MSYS和MinGW,因为他们编译出来的程序比Cygwin快。在这里可以找到:http://www.mingw.org/
第三,需要Linaro ARM GCC编译器,Windows版本的。在这里可以找到:http://www.linaro.org/downloads/
第四,需要Python,Windows版本的。在这里可以找到:https://www.python.org/downloads/
下载、安装,然后在MSYS根目录的/etc/profile里面export PATH=$PATH:[Python安装目录]
第五,需要pkg-config,Windows版本的,这个比较麻烦,需要下载以下三个文件,并提取出我们需要的东西:
http://ftp.acc.umu.se/pub/gnome/binaries/win32/dependencies/pkg-config_0.26-1_win32.zip
(提取pkg-config.exe)
http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.28/glib_2.28.8-1_win32.zip
(提取libglib-2.0-0.dll)
http://ftp.acc.umu.se/pub/gnome/binaries/win32/dependencies/gettext-runtime_0.18.1.1-2_win32.zip (提取intl.dll)
把他们都放到MSYS的bin目录下,然后给pkg-config.exe做一个脚本pkg-config,因为下载的pkg-config.exe比较蠢,在同时指定PKG_CONFIG_SYSROOT_DIR和PKG_CONFIG_LIBDIR这两个环境变量的时候,第一个cflags会输出两次PKG_CONFIG_SYSROOT_DIR。这么做这个脚本:
#!/bin/sh
pushd / > /dev/null
ROOTDIR=`pwd -W 2>/dev/null`
popd > /dev/null
SYSROOT=$PKG_CONFIG_SYSROOT_DIR
pkg-config.exe "$@" | sed "s#$SYSROOT$SYSROOT#$SYSROOT#g" | sed "s#$ROOTDIR##g"
最后去掉$ROOTDIR前缀是为了和Linux Makefile兼容,同时也不会影响在make中的地址转换,最后,QT源码和我的补丁。
我的补丁如下:
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/configure qt-everywhere-opensource-src-5.2.1/qtbase/configure
--- qt-everywhere-opensource-src-5.2.1-old/qtbase/configure 2014-02-02 04:37:23 +0800
+++ qt-everywhere-opensource-src-5.2.1/qtbase/configure 2014-08-27 22:34:47 +0800
@@ -4022,6 +4022,10 @@
done

(cd "$outpath/qmake"; "$MAKE") || exit 2
+ if [ -e "$outpath/bin/qmake.exe" ]; then
+ echo "#!/bin/sh" > "$outpath/bin/qmake"
+ echo "$outpath/bin/qmake.exe" ""$@"" "-unix" >> "$outpath/bin/qmake"
+ fi
fi # Build qmake

echo "Running configuration tests..."
@@ -4091,9 +4095,9 @@
# when xcompiling, check environment to see if it"s actually usable
if [ -z "$PKG_CONFIG_LIBDIR" ]; then
if [ -n "$CFG_SYSROOT" ] && [ -d "$CFG_SYSROOT/usr/lib/pkgconfig" ]; then
- PKG_CONFIG_LIBDIR=$CFG_SYSROOT/usr/lib/pkgconfig:$CFG_SYSROOT/usr/share/pkgconfig
+ PKG_CONFIG_LIBDIR=$CFG_SYSROOT/usr/lib/pkgconfig;$CFG_SYSROOT/usr/share/pkgconfig
if [ -n "$GCC_MACHINE_DUMP" ]; then
- PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:$CFG_SYSROOT/usr/lib/$GCC_MACHINE_DUMP/pkgconfig
+ PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR;$CFG_SYSROOT/usr/lib/$GCC_MACHINE_DUMP/pkgconfig
fi
export PKG_CONFIG_LIBDIR
echo >&2 "Note: PKG_CONFIG_LIBDIR automatically set to $PKG_CONFIG_LIBDIR"
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
--- qt-everywhere-opensource-src-5.2.1-old/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 2014-02-02 04:37:37 +0800
+++ qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 2014-08-28 00:08:34 +0800
@@ -11,14 +11,21 @@
include(../common/g++-unix.conf)

# modifications to g++.conf
-QMAKE_CC = arm-linux-gnueabi-gcc
-QMAKE_CXX = arm-linux-gnueabi-g++
-QMAKE_LINK = arm-linux-gnueabi-g++
-QMAKE_LINK_SHLIB = arm-linux-gnueabi-g++
+QMAKE_CC = arm-linux-gnueabihf-gcc
+QMAKE_CXX = arm-linux-gnueabihf-g++
+QMAKE_LINK = arm-linux-gnueabihf-g++
+QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++

# modifications to linux.conf
-QMAKE_AR = arm-linux-gnueabi-ar cqs
-QMAKE_OBJCOPY = arm-linux-gnueabi-objcopy
-QMAKE_NM = arm-linux-gnueabi-nm -P
-QMAKE_STRIP = arm-linux-gnueabi-strip
+QMAKE_AR = arm-linux-gnueabihf-ar cqs
+QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy
+QMAKE_NM = arm-linux-gnueabihf-nm -P
+QMAKE_STRIP = arm-linux-gnueabihf-strip
+
+# support for OpenGL
+QMAKE_LIBS_EGL = -lEGL
+QMAKE_LIBS_OPENGL_ES1 = -lGLES_CM
+QMAKE_LIBS_OPENGL_ES2 = -lGLESv2
+#QMAKE_LIBS +=
+
load(qt_config)
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/qmake/generators/makefile.cpp qt-everywhere-opensource-src-5.2.1/qtbase/qmake/generators/makefile.cpp
--- qt-everywhere-opensource-src-5.2.1-old/qtbase/qmake/generators/makefile.cpp 2014-02-02 04:37:29 +0800
+++ qt-everywhere-opensource-src-5.2.1/qtbase/qmake/generators/makefile.cpp 2014-08-26 13:53:15 +0800
@@ -1161,8 +1161,8 @@

QString srcf = (*sit).toQString();
QString dstf = (*oit).toQString();
- t << escapeDependencyPath(dstf) << ": " << escapeDependencyPath(srcf)
- << " " << escapeDependencyPaths(findDependencies(srcf)).join(" \ ");
+ t << escapeDependencyPath(dstf).replace(QRegExp("\\"), "/") << ": " << escapeDependencyPath(srcf).replace(QRegExp("\\"), "/")
+ << " " << escapeDependencyPaths(findDependencies(srcf)).replaceInStrings(QRegExp("\\"), "/").join(" \ ");

ProKey comp, cimp;
for(QStringList::Iterator cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) {
@@ -3346,6 +3346,8 @@
QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QString &src, const QString &dst)
{
QString ret;
+ QString src_p = src;
+ QString dst_p = dst;
if (project->isEmpty(replace_rule)
|| project->isActiveConfig("no_sed_meta_install")) {
ret += "-$(INSTALL_FILE) "" + src + "" "" + dst + """;
@@ -3362,7 +3364,7 @@
+ "," + windowsifyPath(replace.toQString()) + ",gi");
}
}
- ret += " "" + src + "" >"" + dst + """;
+ ret += " "" + src_p.replace(QRegExp("\\"), "/") + "" >"" + dst_p.replace(QRegExp("\\"), "/") + """;
}
return ret;
}

struct TermChain {
TermChain(PatternTerm term)
diff -Naur qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lrelease/lrelease.pro qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lrelease/lrelease.pro
--- qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lrelease/lrelease.pro 2014-02-02 04:37:57 +0800
+++ qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lrelease/lrelease.pro 2014-08-28 10:42:55 +0800
@@ -1,4 +1,7 @@
option(host_build)
+
+win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x
+
QT = core-private
DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII

diff -Naur qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lupdate/lupdate.pro qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lupdate/lupdate.pro
--- qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lupdate/lupdate.pro 2014-02-02 04:37:57 +0800
+++ qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lupdate/lupdate.pro 2014-08-28 10:46:59 +0800
@@ -1,4 +1,7 @@
option(host_build)
+
+win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x
+
QT = core-private

qtHaveModule(qmldevtools-private) {
接下来开始配置:

其中-extprefix定义安装位置,在编译完以后可以改,一会儿说;-prefix、-plugindir、-importdir、-qmldir定义的位置是目标板上的位置,加双斜杠是为了防止MSYS翻译这些路径成MSYS的路径,其他的设定与Linux下的编译没有不同。Linux下编译的sysroot可以拷贝到例如:E:/MinGW/opt/sysroot-arm。
然后编译
make module-qtbase
make module-qtdeclarative
cd qttools/src/linguist
../../../qtbase/bin/qmake.exe -unix linguist.pro
make
编译的时候可能会有几个库有链接错误,找不到一大堆gl、egl打头的函数,这是因为相应的Makefile里面的LIBS没有自动加上-lEGL -lGLES_CM -lGLESv2;但是正式使用qmake的时候不会,很奇怪;因为也就几个地方,出问题了手工加一下吧,我没去查原因改代码。
编译linguist的时候可能会遇到这个问题:http://qt-project.org/forums/viewthread/33370,按里面说的处理。
编译完了以后,把下列文件拷贝到Linux下编译的ARM QT开发包的bin目录中去:

然后,删掉对应的ARM QT开发包的bin目录中没有exe后缀的文件,那些是Linux下的。
最后一步,确保安装路径正确,也就是说,如果配置Windows下QT的时候设定-extprefix E:/MinGW/opt/qt/5.2.1/arm,那就要把替换过exe文件的ARM QT开发包放到这个位置,如果路径改了,可以用二进制搜索工具去qmake.exe中替换这个字串。
补充一下关于调试的问题,其实不是很关键。
在使用Debug模式编译的时候,最后会出现如下提示:
warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration
of GDB. Attempting to continue with the default i386 settings.
这是因为在mkspecs/features/unix/gdb_dwarf_index.prf中,有这样一段:
QMAKE_GDB_INDEX +=
test $$(gdb --version | sed -e "s,[^0-9][^0-9]*\([0-9]\)\.\([0-9]\).*,\1\2,;q") -gt 72 &&
gdb --nx --batch --quiet -ex "set confirm off" -ex "save gdb-index $$QMAKE_GDB_DIR" -ex quit "$(TARGET)" &&
test -f $(TARGET).gdb-index &&
$$QMAKE_OBJCOPY --add-section ".gdb_index=$(TARGET).gdb-index" --set-section-flags ".gdb_index=readonly" "$(TARGET)" "$(TARGET)" &&
$$QMAKE_DEL_FILE $(TARGET).gdb-index || true

很显然,这段代码把调试用的GDB默认为“gdb”了,所以应该改成你用的gdb,比如arm-linux-gnueabihf-gdb。另外,这里的sed对GDB版本的判断,无法识别像“GNU gdb (Sourcery CodeBench Lite 2014.05-29) 7.7.50.20140217-cvs”这样的版本信息的,只能识别像“GNU gdb (GDB) 7.6.1”这样的版本信息,所以你有可能看不到刚才那段提示。想解决,要么重新写一段sed的正则表达式,要么直接就把这个test ... -gt 72删掉。

相关推荐

linaro和ubuntu的区别

Linaro is a not-for-profit engineering organization consolidating and optimizing open source Linux software and tools for the ARM architecture.linux-sunxi和linaro没有一点关系。linaro是arm和ti三星等成立的一个开源公司,专门做arm上的系统移植工具链和优化等工作。linaro每个月份发布一个版本,有基于android的也有基于ubuntu的。一般用到的ubuntu的arm版本就是出自linaro的。
2023-07-25 08:52:581

看准 Android 玩家社群,联发科推出相容 Linaro 96Boards 的 Helio X20 开发板

联发科宣布推出一款基于 Helio X20 的硬体开发板,采用符合 Linaro 96Board 开放式开发板规格,主打开发者对于基于 Android 的硬体开发平台需求,强调借由符合 Linaro 96Board 设计可相容其它 96Board 开发板相容,易于将其它开发板的开发成果移植到这款开发板,同时借由高效能、三丛集的 Helio X20 提供更佳的应用。 除了瞄准 Linaro 96Board 开发者,这张 Helio X20 开发板也可用于包括行动 POS 、 VR 设备, ADAS 、智慧看板、智慧零售机器等应用;此开发板在亚洲将透过诚迈科技供货。 Helio 采用三丛集处理器设计,包括双核心 Cortex-A72 以及一组高时脉四核心 Cortex-A53 与一组时脉较低的 Cortex-A53 ,搭配 ARM Mali-T880MP4 GPU 构成。 你或许会喜欢 倒数一个月!Win10免费升级只到7/29 有了这张卡,国外旅游无限上网吃到饱
2023-07-25 08:53:051

如何安装gcc-linaro-arm-linux-gnueabihf-4.8-2014.03

1、 如果要自己编译工具链,从以下链接下载源码crosstools-ng下载地址http://ymorin.is-a-geek.org/download/crosstool-ng/同时对每一个版本都有相应的补丁我们尽量把这些补丁打上,这些补丁的下载地址是http://ymorin.is-a-geek.org/download/crosstool-ng/01-fixes/2、 解压工具链压缩包$ cd ~$ mkdir toolchain$ cd toolchain 将下好的gcc-linaro-arm-linux-gnueabihf-4.8-2014.03拷贝到toolchain目录下并解压$ tar -xvf gcc-linaro-arm-linux-gnueabihf-4.8-2014.03 gcc-4.83、 环境变量的添加修改文件/etc/bash.bashrc添加如下内容export PATH=$PATH:/home/linux/toolchain/gcc-4.8/bin重启配置文件$ source /etc/bash.bashrc4、 工具链的测试$ arm-none-linux-gnueabi-gcc –vUsing built-in specs.COLLECT_GCC=arm-none-linux-gnueabi-gccCOLLECT_LTO_WRAPPER=/home/david/Exynos4412/toolchain/gcc-4.6.4/bin/../libexec/gcc/arm-arm1176jzfssf-linux-gnueabi/4.6.4/lto-wrapperTarget: arm-arm1176jzfssf-linux-gnueabiConfigured with: /work/builddir/src/gcc-4.6.4/configure--build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu--target=arm-arm1176jzfssf-linux-gnueabi--prefix=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4--with-sysroot=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot--enable-languages=c,c++ --with-arch=armv6zk --with-cpu=arm1176jzf-s--with-tune=arm1176jzf-s --with-fpu=vfp --with-float=softfp--with-pkgversion="crosstool-NG hg+default-2685dfa9de14 - tc0002"--disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap--disable-libgomp --disable-libssp --disable-libquadmath--disable-libquadmath-support--with-gmp=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-mpfr=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-mpc=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-ppl=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-cloog=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-libelf=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools--with-host-libstdcxx="-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm"--enable-threads=posix --enable-target-optspace --without-long-double-128--disable-nls --disable-multilib --with-local-prefix=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot--enable-c99 --enable-long-longThread model: posixgcc version 4.6.4 (crosstool-NG hg+default-2685dfa9de14 -tc0002)这样我们的交叉工具链就安装好了
2023-07-25 08:53:142

Arm提出ServerReady认证计画 各品牌伺服器系统更加相容互通

在ServerReady相容认证之下,各家厂商供应的伺服器系统将可在最低限度标准下,让伺服器产品在出厂时便可预设安装作业系统与应用程式,并且维持高度相容性,让不同品牌厂商打造的伺服器系统彼此互通使用,同时也能在维持基础标准之下创造产品差异化。 针对市场推出以Arm架构为设计的伺服器,Arm宣布推出ServerReady相容认证计画,借此协助合作伙伴更快速地以高度相容性布署Arm伺服器系统。 首波加入ArmServerReady相容认证计画的合作伙伴,分别包含微软、技嘉、HPE(HewlettPackardEnterprise)、Linaro、Marvell、Ampere、Femrice、Qualm、AMI、RedHat、华芯通、华为、百敖、创新科在内业者,同时目前多加晶片供应厂商也已经获得ArmServerReady1.0版本认证。 在ServerReady相容认证之下,各家厂商供应的伺服器系统将可在最低限度标准下,让伺服器产品在出厂时便可预设安装作业系统与应用程式,并且维持高度相容性,让不同品牌厂商打造的伺服器系统彼此互通使用,同时也能在维持基础标准之下创造产品差异化。 目前Arm已经与晶片供应商、独立韧体厂商、作业系统与hypervisor程式厂商、OEM/ODM代工厂、独立硬体厂商,以及云端基础设施供应商合作制定最低硬体要求,其中包含伺服器基础系统架构(ServerBaseSystemArchitecture;SBSA)规范,以及在伺服器基础启动需求(ServerBaseBootRequirements;SBBR)规范中定义最低韧体要求,另外更沿用既有业界标准与Arm制定全新规范,藉以确保各家厂商产品相容互通性。 同时,Arm也制定架构规范套件(ACS,ArchitectureComplianceSuite)持续推动SBSA及SBBR认证。 此次推行的ArmServerReady相容认证计画,将包含执行标准作业系统与架构规范套件,厂商可选择自行推动,也能透过Arm支援团队协助导入,借此顺利获得认证。而在ArmServerReady1.0版本中,将使用ACS1.6版本,并且针对SBSA3.1版本与SBBR1.0版本规范测试产品相容性,未来将进一步推动SBSA5.0版本与SBBR1.1版本,同时将讷入全新伺服器基础管理准则(ServerBaseManageabilityGu;SMBG)规范,预计成为未来新版ArmServerReady认证计画项目,将可作为未来伺服器系统全新标准。
2023-07-25 08:53:211

LinaRoessler是做什么的

LinaRoesslerLinaRoessler是一名演员,代表作品是《跟随旋律》。外文名:LinaRoessler职业:演员代表作品:跟随旋律合作人物:Charles-OlivierMichaud
2023-07-25 08:53:281

华为海思在中国芯片业界究竟是一个什么样的存在?

你买不到第一个原因是海思销售额约80%-90%的芯片是不外售的。外售的部分无非就是三四个领域的芯片,安防摄像头,机顶盒,电视,电表。而且也都是2B市场销售的,2C市场从来都不是嵌入式芯片的主要销售对象。电视和机顶盒行业海思现在是扮演行业霸主 AMlogic 和 Mstars 挑战者的角色,现在接近三分天下有其一的水平。这类芯片单价不高,毛利也偏低,但单论发货量是九位数的数量级。安防摄像头是海思深耕多年的领域,这个领域海思是后来居上者,主要竞争对手是安霸、TI和marvell。受惠于国内安防设备商(大华,海康,...)的强势,现在海思国内市占率大概七八成,全球范围市占率一半以上。电表芯片我没了解过不说了。以上领域皆有每年份的公开数据可查。我划个重点,这些都是高集成度芯片。第二个原因是你不是半导体从业者,你列举的网站,是给单片机爱好者和学生买电阻电容、电源、memory和flash、I/O这些module,而甚至连卖开发板的网站都不是,更不用说高集成度的芯片了。换句话说,就是你列举的那些网站,都应该算元器件采购网,一般都不会涉及上面列举的几个领域内的高集成度,综合性的芯片。不信你可以试着搜一下你那些网站能不能买到tegra。事实上芯片要到哪里买?鉴于99.99%的个人开发者和学生都不可能有能力去手工做一个2美金左右的机顶盒芯片对应的 mother board,所以能卖的无非就是集成了芯片和 mother board 的开发单板。偏向于嵌入式应用的个人开发者倾向于使用树莓派或者 Arduino 这些社区活跃度高的开发板,ARM 的信徒们玩儿 mbed,追求原滋原味 linux 的玩家们一般在 linaro 钦定的 96 Boards 消费,而真正的硬核玩家show muscle的方式是给 RISC-V 写驱动和适配。事实上高集成度的芯片行业基本上就没什么 2C 领域这一说,主要销售对象都是 2B 的。个人开发者芯片的消耗量,相对于设备厂商完全没有可比性。而每个芯片应用到不同的设备上,基本都要进行可靠性测试、客制化,包括了AE、FAE的全程跟踪,technical support 才是无尽的地狱。没有芯片厂商愿意花时间人力来处理个人开发者插面包板时遇到的 issue 。工业上实际大规模应用到的元器件,有的应该比你列举到的领先一些,有的可能和你列举的差不多共代,但是共同点就是,采购的成本,大部分在你列举网站的10%-20%之间。事实上华为的芯片也是能买到的。上面提到的 linaro 的生态链商店96 boards 上,就能搜索到HiKey 960和HiKey 970,对应的啥芯片自己看名字猜。还有Poplar事实上是海思电视芯片的马甲。这些开发板包含了对应的SDK包,但是对开发者支持都非常有限。(淘宝有售)海思把这批开发板放出来,主要是基于与 linaro 的合作关系,和作为对 Linux 社区的贡献。事实上96 Boards 上多数的单板,厂商都希望你们都别去买别去提 issue 。
2023-07-25 08:53:3814

求问zedboard开发板移植linaro linux时出现的问题

不是很明白了吗ERROR: can"t get kernel image!读取不到内核镜像啊,这个原因有很多,最常见的是:1、你的u-boot环境变量设置问题2、nandflash有坏块,导致读取数据出错,应该先检查是否有坏块,然后重新擦除写入内核吧
2023-07-25 08:54:461

如何查看Linux或者gcc版本

1. 查看Linux版本cat/etc/issueLinaro 12.07 l2. 查看内核版本1)cat/proc/versionLinux version 2.6.38-13-generic(buildd@rothera) (gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)) #57-Ubuntu SMP Mon Mar 5 18:10:14 UTC 2012Linux version 3.4.29+ (ubuntu@linux-server) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #7 PREEMPT Mon Aug 5 13:37:28 CST 20132) uname命令uname-aLinux ubuntu 2.6.38-13-generic#57-Ubuntu SMP Mon Mar 5 18:10:14 UTC 2012 i686 i686 i386GNU/LinuxLinux ubuntu 3.4.29+ #7 PREEMPT Mon Aug 5 13:37:28 CST 2013 armv7l armv7l armv7l GNU/Linux[--------------------------------------------------------------------------------a, --all print all information, inthe following order, 查看全部信息except omit -p and -i ifunknown:-s, --kernel-name print the kernelname 查看内核名字-n, --nodename print the network nodehostname-r, --kernel-release print the kernelrelease 查看内核发行版本-v, --kernel-version print the kernelversion 查看内核版本-m, --machine print the machinehardware name-p, --processor print the processortype or "unknown"-i, --hardware-platform print thehardware platform or "unknown"-o, --operating-system print theoperating system 查看操作系统--help display this help andexit--version output version informationand exit--------------------------------------------------------------------------------------]3.查看系统位数1) getconfWORD_BIT322)file/bin/bash/bin/bash: ELF 32-bit LSB executable,Intel 80386, version 1 (SYSV), dynamically linked (uses sharedlibs), for GNU/Linux 2.6.15, stripped/bin/bash: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.31, BuildID[sha1]=0x1266f80916e3e59eb001459610510f5d05630297, stripped4. 查看gcc版本gcc--versiongcc (Ubuntu/Linaro 4.5.2-8ubuntu4)4.5.2gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
2023-07-25 08:54:532

arm-linux-androideabi于arm-linux-gnueabi区别

现在android的工程大部分是用clang编译,在之前的android工程主要是使用gcc,也就是arm-linux-androideabi-gcc,但是其他嵌入式系统使用的是arm-linux-gnueabi,那么这两个有什么区别呢? 能不能混用呢? 先说区别,根据linaro给的,主要有三处 1)There are a few differences between the Linux EABI and Android EABI definitions - most notably, Android defines the size of an enum to 32 bits while regular Linux defines it as variable. 2)Android does not currently use the hardfloat ABI conventions that have become common in regular Linux. 3)Android uses the Gold linker by default while the regular Linux builds default to using the BFD linker (this is for upstream compatibility - Android uses gold while most regular Linux distributions use the BFD linker). 翻译后是两者之前区别很少,主要有enum不一样,谷歌定义enum为32为,而其他的都定义为变量。android编译器使用的是softfp,而其他的使用的是hardfloat,如果使用linux-arm-gnueabi编译android工程的话,会出现“unrecognized option "-mfloat-abi=softfp"”就是指的这个,第三个是linker不同,这个应该好理解,android在bionic中定制了linker。
2023-07-25 08:55:011

博通宣布将采用 16nm 制程推出 ARMv8 伺服器级应用处理器

网通大厂Broad博通宣布,将以16nm制程推出基于ARMv8指令集的多核应用处理器,针对如网路连线、通讯、巨量资料、储存与安全性等提供具备网路功能虚拟化的伺服器级效能与虚拟化能力,Broad的核心将基于ARMCortex-A50架构,具备4指令执行与4执行绪,时脉将达3GHz。 另外博通亦与ARM合作,透过博通身兼LinaroNeorkingGroup与欧洲电信标准学会成员的优势,共同打造开放且标准化的NFV软体设计环境,希望将程式设计模型、工具链、应用程式设计界面与网路函式库标准化,以利设备制造商在设计符合次世代电信标准的NFV解决方案时能够跨平台的使用程式码,加速设备开发。
2023-07-25 08:55:191

OpenJDK和Oracle JDK在ARM嵌入式系统中性能差异为什么这么大

在题主回复前先随便写点:如果题主用的平台是ARMv7,那么Oracle JDK有Java SE版,也有Java SE Embedded版可以在上面运行。这两者中的JVM都是HotSpot VM,里面都是标准配备。而目前在已经整合进主干的代码里,OpenJDK只有Zero VM可以在ARMv7上运行,这不是标准的HotSpot VM,而是一个实现得比较粗糙的、为了简易跨平台而牺牲了性能的实现。拿这个跟标配HotSpot VM比当然比不过。如果是说AArch64,则Oracle JDK有一套私有实现,OpenJDK里有一套Red Hat/Linaro贡献的开源实现,两者不是同一个东西。虽然都是标配HotSpot VM,但Oracle版还是更优化一些,开源版仍需努力…ARMv7上还有若干其它情况。一种是Red Hat的另一个OpenJDK port,叫做microJIT,专攻资源非常受限的场景——实现较简单,性能不如标配HotSpot VM;另一种是最近正在如火如荼的开发中的、跟Java SE Embedded版同级别的标配HotSpot VM的开源port,Linaro抢先发布消息,而鄙司(Azul Systems)也在大力投入开发资源,产品名为Zulu Embedded。这个到明年中会有更多消息。
2023-07-25 08:55:261

工业控制用linux还是stm32多

工业控制用linux比stm32多。STM32MP1强调适用于所有用户,但是工业控制领域采用Linux操作系统较多,消费领域采用安卓操作系统比较多,对于这一现状,ST表示第一款产品首先支持Linux操作系统,是从STM32MP1的性能考量。整套STM32MP1软件套件可以简化客户的流程开发,其中重要的一点是STM32MP1的Linux平台,全面兼容主流行的OpenLinux开发包。目前,STM32MP1SoC驱动程序已被Linux社区采用和认可,ST的STM32MP1支持Linux4.19LTS,LTS表示ST会长期支持这一软件发行版。在支持整个Linux开发源时,STM32MP1全面兼容开源软件的标准,包括Linux的Foundation和YoctoProject,因为Linux代码开源,而且非常多,客户不可能全部都用或者清楚哪个好用,ST在Yocto建立一个Project,客户可以稳定简易使用这个开发包,而且支持Linaro社区,里面有一些参考软件和培训。因为Linux是开源的,代表是公开的,所以预集成安全操作系统OP-TEE,客户不需要再付费;客户可以使用免费的加密OS,让系统在可信区域加密,公开用的数据全部用开源的Linux。ST还为STM32MP1提供了硬件解决方案。STM32MP1提供两种开发板:一是全部功能板,支持157A和157C,157C是安全加密功能升级的部分;探索板有两套,一套是精简版本,包括MP1+基本外设,还有一个相对完整的功能,配了MIPI屏和Wi-Fi/BT射频模块,当用户需要做无线连接时,可以以此为原型来开发。
2023-07-25 08:55:341

如何在Windows下构建ARM Linux QT开发环境

准备工作:首先,最不可思议的,是要在Linux下把QT编译一遍,因为库都是一样的,需要的就是一些Windows下的qmake、moc、uic之类的工具而已。因为QT源码很多地方不能在Windows下面交叉编译通过,虽然我改了一些代码和配置(一会儿我贴出补丁来),但我只用它编译了qtbase、qtdeclarative这两个模块和qttools模块中的一部分。Linux下的编译可以参照我之前写的这篇文章。参考配置:开发包:./configure -extprefix /opt/qt/5.2.1/arm -prefix /usr -plugindir /usr/lib/qt/plugins -importdir /usr/lib/qt/imports -qmldir /usr/lib/qt/qml -make libs -xplatform linux-arm-gnueabi-g++ -opengl es2 -confirm-license -opensource -xcb -xinput2 -nomake examples -nomake tests -qt-zlib -qt-xcb -dbus -largefile -cups -no-fontconfig -glib -gtkstyle -qt-freetype -sysroot /opt/sysroot-arm -mysql_config /opt/sysroot-arm/usr/bin/mysql_config -v运行库:./configure -prefix /usr -plugindir /usr/lib/qt/plugins -importdir /usr/lib/qt/imports -qmldir /usr/lib/qt/qml -make libs -xplatform linux-arm-gnueabi-g++ -opengl es2 -confirm-license -opensource -xcb -xinput2 -nomake examples -nomake tests -qt-zlib -qt-xcb -dbus -largefile -cups -no-fontconfig -glib -gtkstyle -qt-freetype -sysroot /opt/sysroot-arm -mysql_config /opt/sysroot-arm/usr/bin/mysql_config -v做完这一步,你获得两样东西,sysroot和linux下的ARM QT开发文件。sysroot是编译QT之前,用Buildroot做的开发用根目录。这两个东西都要拷贝到Windows里,因为Windows不支持符号连接,拷贝需要需要去掉这些连接,这么做:cp [源目录] [目标目录] -Lr第二,需要一个Windows下模拟Linux环境的东西和编译器,我用的是MSYS和MinGW,因为他们编译出来的程序比Cygwin快。在这里可以找到:http://www.mingw.org/。第三,需要Linaro ARM GCC编译器,Windows版本的。在这里可以找到:http://www.linaro.org/downloads/第四,需要Python,Windows版本的。在这里可以找到:https://www.python.org/downloads/下载、安装,然后在MSYS根目录的/etc/profile里面export PATH=$PATH:[Python安装目录]第五,需要pkg-config,Windows版本的,这个比较麻烦,需要下载以下三个文件,并提取出我们需要的东西:http://ftp.acc.umu.se/pub/gnome/binaries/win32/dependencies/pkg-config_0.26-1_win32.zip(提取pkg-config.exe)http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.28/glib_2.28.8-1_win32.zip(提取libglib-2.0-0.dll)http://ftp.acc.umu.se/pub/gnome/binaries/win32/dependencies/gettext-runtime_0.18.1.1-2_win32.zip (提取intl.dll)把他们都放到MSYS的bin目录下,然后给pkg-config.exe做一个脚本pkg-config,因为下载的pkg-config.exe比较蠢,在同时指定PKG_CONFIG_SYSROOT_DIR和PKG_CONFIG_LIBDIR这两个环境变量的时候,第一个cflags会输出两次PKG_CONFIG_SYSROOT_DIR。这么做这个脚本:#!/bin/shpushd / > /dev/nullROOTDIR=`pwd -W 2>/dev/null`popd > /dev/nullSYSROOT=$PKG_CONFIG_SYSROOT_DIRpkg-config.exe "$@" | sed "s#$SYSROOT$SYSROOT#$SYSROOT#g" | sed "s#$ROOTDIR##g"最后去掉$ROOTDIR前缀是为了和Linux Makefile兼容,同时也不会影响在make中的地址转换,最后,QT源码和我的补丁。我的补丁如下:diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/configure qt-everywhere-opensource-src-5.2.1/qtbase/configure--- qt-everywhere-opensource-src-5.2.1-old/qtbase/configure 2014-02-02 04:37:23 +0800+++ qt-everywhere-opensource-src-5.2.1/qtbase/configure 2014-08-27 22:34:47 +0800@@ -4022,6 +4022,10 @@ done (cd "$outpath/qmake"; "$MAKE") || exit 2+ if [ -e "$outpath/bin/qmake.exe" ]; then+ echo "#!/bin/sh" > "$outpath/bin/qmake"+ echo "$outpath/bin/qmake.exe" ""$@"" "-unix" >> "$outpath/bin/qmake"+ fi fi # Build qmake echo "Running configuration tests..."@@ -4091,9 +4095,9 @@ # when xcompiling, check environment to see if it"s actually usable if [ -z "$PKG_CONFIG_LIBDIR" ]; then if [ -n "$CFG_SYSROOT" ] && [ -d "$CFG_SYSROOT/usr/lib/pkgconfig" ]; then- PKG_CONFIG_LIBDIR=$CFG_SYSROOT/usr/lib/pkgconfig:$CFG_SYSROOT/usr/share/pkgconfig+ PKG_CONFIG_LIBDIR=$CFG_SYSROOT/usr/lib/pkgconfig;$CFG_SYSROOT/usr/share/pkgconfig if [ -n "$GCC_MACHINE_DUMP" ]; then- PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:$CFG_SYSROOT/usr/lib/$GCC_MACHINE_DUMP/pkgconfig+ PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR;$CFG_SYSROOT/usr/lib/$GCC_MACHINE_DUMP/pkgconfig fi export PKG_CONFIG_LIBDIR echo >&2 "Note: PKG_CONFIG_LIBDIR automatically set to $PKG_CONFIG_LIBDIR"diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf--- qt-everywhere-opensource-src-5.2.1-old/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 2014-02-02 04:37:37 +0800+++ qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 2014-08-28 00:08:34 +0800@@ -11,14 +11,21 @@ include(../common/g++-unix.conf) # modifications to g++.conf-QMAKE_CC = arm-linux-gnueabi-gcc-QMAKE_CXX = arm-linux-gnueabi-g++-QMAKE_LINK = arm-linux-gnueabi-g++-QMAKE_LINK_SHLIB = arm-linux-gnueabi-g+++QMAKE_CC = arm-linux-gnueabihf-gcc+QMAKE_CXX = arm-linux-gnueabihf-g+++QMAKE_LINK = arm-linux-gnueabihf-g+++QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++ # modifications to linux.conf-QMAKE_AR = arm-linux-gnueabi-ar cqs-QMAKE_OBJCOPY = arm-linux-gnueabi-objcopy-QMAKE_NM = arm-linux-gnueabi-nm -P-QMAKE_STRIP = arm-linux-gnueabi-strip+QMAKE_AR = arm-linux-gnueabihf-ar cqs+QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy+QMAKE_NM = arm-linux-gnueabihf-nm -P+QMAKE_STRIP = arm-linux-gnueabihf-strip++# support for OpenGL+QMAKE_LIBS_EGL = -lEGL+QMAKE_LIBS_OPENGL_ES1 = -lGLES_CM+QMAKE_LIBS_OPENGL_ES2 = -lGLESv2+#QMAKE_LIBS += + load(qt_config)diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/qmake/generators/makefile.cpp qt-everywhere-opensource-src-5.2.1/qtbase/qmake/generators/makefile.cpp--- qt-everywhere-opensource-src-5.2.1-old/qtbase/qmake/generators/makefile.cpp 2014-02-02 04:37:29 +0800+++ qt-everywhere-opensource-src-5.2.1/qtbase/qmake/generators/makefile.cpp 2014-08-26 13:53:15 +0800@@ -1161,8 +1161,8 @@ QString srcf = (*sit).toQString(); QString dstf = (*oit).toQString();- t << escapeDependencyPath(dstf) << ": " << escapeDependencyPath(srcf)- << " " << escapeDependencyPaths(findDependencies(srcf)).join(" \ ");+ t << escapeDependencyPath(dstf).replace(QRegExp("\\"), "/") << ": " << escapeDependencyPath(srcf).replace(QRegExp("\\"), "/")+ << " " << escapeDependencyPaths(findDependencies(srcf)).replaceInStrings(QRegExp("\\"), "/").join(" \ "); ProKey comp, cimp; for(QStringList::Iterator cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) {@@ -3346,6 +3346,8 @@ QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QString &src, const QString &dst) { QString ret;+ QString src_p = src;+ QString dst_p = dst; if (project->isEmpty(replace_rule) || project->isActiveConfig("no_sed_meta_install")) { ret += "-$(INSTALL_FILE) "" + src + "" "" + dst + """;@@ -3362,7 +3364,7 @@ + "," + windowsifyPath(replace.toQString()) + ",gi"); } }- ret += " "" + src + "" >"" + dst + """;+ ret += " "" + src_p.replace(QRegExp("\\"), "/") + "" >"" + dst_p.replace(QRegExp("\\"), "/") + """; } return ret; } struct TermChain { TermChain(PatternTerm term)diff -Naur qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lrelease/lrelease.pro qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lrelease/lrelease.pro--- qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lrelease/lrelease.pro 2014-02-02 04:37:57 +0800+++ qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lrelease/lrelease.pro 2014-08-28 10:42:55 +0800@@ -1,4 +1,7 @@ option(host_build)++win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x+ QT = core-private DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII diff -Naur qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lupdate/lupdate.pro qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lupdate/lupdate.pro--- qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lupdate/lupdate.pro 2014-02-02 04:37:57 +0800+++ qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lupdate/lupdate.pro 2014-08-28 10:46:59 +0800@@ -1,4 +1,7 @@ option(host_build)++win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x+ QT = core-private qtHaveModule(qmldevtools-private) {接下来开始配置:其中-extprefix定义安装位置,在编译完以后可以改,一会儿说;-prefix、-plugindir、-importdir、-qmldir定义的位置是目标板上的位置,加双斜杠是为了防止MSYS翻译这些路径成MSYS的路径,其他的设定与Linux下的编译没有不同。Linux下编译的sysroot可以拷贝到例如:E:/MinGW/opt/sysroot-arm。然后编译make module-qtbasemake module-qtdeclarativecd qttools/src/linguist../../../qtbase/bin/qmake.exe -unix linguist.promake编译的时候可能会有几个库有链接错误,找不到一大堆gl、egl打头的函数,这是因为相应的Makefile里面的LIBS没有自动加上-lEGL -lGLES_CM -lGLESv2;但是正式使用qmake的时候不会,很奇怪;因为也就几个地方,出问题了手工加一下吧,我没去查原因改代码。编译linguist的时候可能会遇到这个问题:http://qt-project.org/forums/viewthread/33370,按里面说的处理。编译完了以后,把下列文件拷贝到Linux下编译的ARM QT开发包的bin目录中去:然后,删掉对应的ARM QT开发包的bin目录中没有exe后缀的文件,那些是Linux下的。最后一步,确保安装路径正确,也就是说,如果配置Windows下QT的时候设定-extprefix E:/MinGW/opt/qt/5.2.1/arm,那就要把替换过exe文件的ARM QT开发包放到这个位置,如果路径改了,可以用二进制搜索工具去qmake.exe中替换这个字串。补充一下关于调试的问题,其实不是很关键。在使用Debug模式编译的时候,最后会出现如下提示:warning: A handler for the OS ABI "GNU/Linux" is not built into this configurationof GDB. Attempting to continue with the default i386 settings.这是因为在mkspecs/features/unix/gdb_dwarf_index.prf中,有这样一段:QMAKE_GDB_INDEX += test $$(gdb --version | sed -e "s,[^0-9][^0-9]*\([0-9]\)\.\([0-9]\).*,\1\2,;q") -gt 72 && gdb --nx --batch --quiet -ex "set confirm off" -ex "save gdb-index $$QMAKE_GDB_DIR" -ex quit "$(TARGET)" && test -f $(TARGET).gdb-index && $$QMAKE_OBJCOPY --add-section ".gdb_index=$(TARGET).gdb-index" --set-section-flags ".gdb_index=readonly" "$(TARGET)" "$(TARGET)" && $$QMAKE_DEL_FILE $(TARGET).gdb-index || true很显然,这段代码把调试用的GDB默认为“gdb”了,所以应该改成你用的gdb,比如arm-linux-gnueabihf-gdb。另外,这里的sed对GDB版本的判断,无法识别像“GNU gdb (Sourcery CodeBench Lite 2014.05-29) 7.7.50.20140217-cvs”这样的版本信息的,只能识别像“GNU gdb (GDB) 7.6.1”这样的版本信息,所以你有可能看不到刚才那段提示。想解决,要么重新写一段sed的正则表达式,要么直接就把这个test ... -gt 72删掉。
2023-07-25 08:55:411

华为发布鲲鹏芯片架构(中国芯片新消息)

在众多中国神话中,能与独角兽相提并论的神话动物并不多,而鲲鹏恰好是其中最具标志性的一种。道教《庄子逍遥游》。这本书里记载着 quot在北京有一种鱼,它的名字叫鲲 quot。我不 我不知道昆明有多大,但它在千里之外。又变成了一只鸟,名字叫彭。彭 回来了,我不 我不知道它有几千英里。愤怒地飞翔,它的翅膀像天空悬挂的云。鲲鹏常用来比喻一些宏大的事物。常言道, quot学做鲲鹏,飞向万里,却不 不要做一只鸟 的窝。鲲鹏也成为继麒麟之后又一个雄心勃勃的产品和技术布局。徐文伟强调,在计算趋势中,虽然从终端收集的庞大数据可以通过所谓的边缘计算共享,但对于当前的云计算基础设施来说,这仍然是一个沉重的负担。如何解决庞大的数据流量以及对存储和实时计算的需求,成为各云服务器厂商积极寻求突破的关键。徐文伟指出,通过与ARM的合作和大规模核心集成,大数据的实时处理和计算得到了很好的解决。符合去年发布的瑞星架构 的全连接大会,以及手机等边缘计算加入的NPU计算能力,华为拥有强大的生态优势。同时,徐文伟还强调,华为不会走封闭的道路,将继续与英特尔和其他合作伙伴合作。当然,与行业伙伴的合作还会继续,但为了摆脱依赖,增加自主能力,华为一直是其发展的重点。徐文伟谈到这一点,拿出了他最新的服务器芯片,也是今天 主角:鲲鹏服务器芯片鲲鹏920。鲲鹏920集成64核,主频2.6 GHz。该芯片组集成了8通道DDR4,内存带宽超过现有产品的46%。通过两个100G RoCE端口,系统集成度也显著提高。鲲鹏920支持PCIe 4.0和CCIX接口,总带宽640 Gbps。此外,单槽速度是现有产品的两倍,有效提升了存储和各种加速器的性能。另外值得一提的是,鲲鹏芯片在单个封装中集成了传统计算芯片的四种结构,包括网络、存储、主控芯片和CPU。鲲鹏芯片还集成了一个8通道内存控制器,提供了比之前架构更高的整体带宽输出性能,提升幅度超过48%,可以为带宽要求高、实时计算能力要求高的计算环境带来极大的帮助。鲲鹏920是业界最高性能的基于ARM的服务器CPU。采用最先进的7nm工艺,CPU由华为自主设计,基于ARMv8架构授权。通过优化分支预测算法、增加运算单元数量和改进存储子系统结构,显著提高了处理器性能。在典型的时钟速度下,Quantum 920 CPU在SPECint基准测试中的得分超过930,比行业基准高出25%。同时,电源效率比行业同行高30%。鲲鹏920为数据中心提供更高的计算性能,同时降低功耗。华为 在创新上的不断进步也体现在它在服务器产品上的重要表现。不仅在性能上有优势,其服务器产品总出货量已经达到356万台,成为华为的又一支柱。吴雄 安科技中国区执行董事兼CEO ang强调了ARM生态所拥有的强大计算生态,可以帮助华为更好地在云计算方面发挥作用。华为总裁邱龙 的智能计算业务部,上台宣布了基于鲲鹏芯片的泰山服务器产品线。他还强调,这些服务器是为海量存储和数据计算而设计的,所有的生态都是基于原生ARM生态研发的,包括硬件和软件的适配等。因为原生应用可以发挥硬件的最大效率,华为还强调在泰山推出之前,软件开发环境已经完成,而这一切不仅仅是原生应用和优化,邱龙还强调他在自己的服务器设计中提供了更高效的存储模式和更好的动态管理机制,让各种计算场景都能达到更好的效果,同时降低管理成本。邱龙还宣布,华为 美国云计算将使用基于鲲鹏的泰山服务器,并提供比其竞争对手三倍以上的整体输出性能。云手机服务也同时开放,提供直接在云端运行App的能力。华为还邀请了几个关键的合作伙伴来谈谈基于ARM生态系统的创新计算。华为不断推动硬件、基础软件和应用的行业合作。华为一直与绿色计算联盟、Linaro、Open Edge、HPC Initiative等行业组织合作,与Hortonworks、微软、SAP、SUSE、Ubuntu等合作伙伴共同构建开放协作的行业生态系统。和中国标准软件。硬件方面,华为是Linaro的核心成员。在基础软件方面,华为是OpenStack基金会的白金会员和云原生计算基金会的创始成员。在应用方面,华为已经加入了海湾合作委员会。GCC发布了绿色计算联盟服务器的技术标准报告,以及其他构建绿色开源计算社区的努力。华为也是OEHI的成员。布局已久的智能计算技术其实早在去年 智能计算大会,华为宣布从2018年12月21日起,其服务器将全面升级为华为智能计算。作为华为 基于连接、计算和云的三大任务,智能计算的重要性不言而喻。在当天的华为智能计算大会上,华为 的新智能计算业务战略旨在解决行业面临的四个主要问题 智能,即计算电源、数据协同、场景部署、专业技术。为了解决这些问题,华为 的智能计算业务将专注于四个方面:计算能力、工程、云端协作和集成解决方案。团队也在会上展示了自己的努力。会上公布的亮点有:将其FusionServer升级为FusionServer pro,并将数据中心升级为智能数据中心;2019年,华为 首款AI管理芯片将诞生,可以自动预测整个设备管理故障。虽然当天已经提到了64核ARM架构处理器鲲鹏芯片,但是今天 拥有更多细节和生态支持的s的出现,表明华为正在积极推动整体计算行业的创新,在拥抱行业合作伙伴的同时,积极推动自己架构的研发。这代表了与世界接轨,但同时拥有核心技术的两种诉求。对于现在的中国行业来说,其实是一个值得学习的点。云计算竞争激烈,拥有生态才有话语权随着中国云计算市场的快速扩张,竞争也越来越激烈。其中,拥有优质互联网基因的阿里和腾讯在公有云领域已经处于领先地位。阿里云占据中国半壁江山 版图,规模效应优势明显,而腾讯云围绕游戏和视频业务优势,在游戏云和视频云领域领先。2018Q1,腾讯其他业务同比增长111%,其中云业务增速超过100%。以华为为首的传统IT企业的进攻不容忽视。在刚刚过去的2018年,华为发布了一款 quot大招 quot在10月举行的全连接大会上,并一口气发布了3354盛腾910和盛腾310两款自研AI芯片,成为华为 的智能计算架构。其中,盛腾910采用7nm工艺,半精度256T,据说是全球单颗计算能力最高的AI芯片,计算能力远超Google和Nvidia。盛腾310采用12nm工艺,最大功耗仅8W,整数精度16T,是计算效率极高、功耗极低的主力AI芯片。当时许华伟智骏也给出了这两款AI芯片的上市时间为2019年第二季度。2019年,华为还将推出三款AI芯片,都属于瑞星系列。同时,华为将提供AI云服务ba特别需要强调的是,盛腾910和盛腾310这两款自研AI芯片采用了华为研发的达芬奇架构和华为研发的高效灵活的CISC指令集。每个AI核心可以在一个周期内完成4096次MAC计算。它们集成了张量、向量和标量等各种计算单元,支持多种混合精度计算,以及训练和推理场景下的数据精度计算。在华为之前,百度和阿里巴巴已经宣布布局自己的AI芯片。百度 昆仑芯片采用自主设计的架构。尽管该芯片仍处于设计阶段,但该公司声称其理论计算能力是英伟达的两倍多 的方案。阿里巴巴宣布将投资阿里-NPU神经网络芯片的研发。这种架构不提绝对性能,而是强调其超强性价比,号称超越传统CPU/GPU架构40倍。虽然腾讯尚未宣布自有ai芯片的布局,但此前已投资了体素云、碳云智能、甄氏科技、蔚来汽车等公司,发展方向主要是AI的产业应用,与其他公司不同。此次发布的鲲鹏芯片,其背后的ARM生态布局,不仅构成了华为 在服务器和云计算业务上拥有自己的通用计算架构,也确保了华为从云到端都能拥有自己的核心竞争优势。麒麟和鲲鹏两大猛兽,将继续成为华为最大的驱动力 美国未来的生态进步。云计算已经华为下一个经营重点,两大神兽从端到云分头并进华为2008年开始云计算的研发,正式发布华为 云计算战略和端到端解决方案,并于2015年7月30日发布了面向中国市场的企业云服务,积极探索开发、运营、运维一体化模式,与合作伙伴携手打造 开放、协作和供应 云合作生态系统。2017年,之前属于PS部门的Cloud BU迁移到华为集团,成为华为 继运营商BG、企业BG、终端BG之后的第四大业务单元,发布华为 发展云计算的巨大决心。也是在这一年,华为宣布进军公有云,并表示其优势在于可以提供 quot云、边、端和连接 quot。2018年7月,华为云公布了一些核心 quot成绩单 quot。官方数据显示,仅2018年上半年,华为云 合作伙伴增长45%,其营收同比增长700%。云市场上有872个新应用,软件开发服务DevCloud有9万名开发者。在人工智能领域,华为云推出了ei agent,发布了深度学习、图像搜索、EI智能视频等一系列服务。推动AI在行业中的应用场景;在计算领域,推出了全新的网络增强型云服务器C3ne,让云计算进入千万级网络转发时代。云安全方面,国内首个全平台、全业务、全节点通过PCI-DSS安全认证,高分通过公安部网络安全等级保护四级测评。华为云能取得上述成就。从软硬件到解决方案,华为云 长期的技术积累赋予其后发优势。过去,华为一直以麒麟兽称霸移动和边缘计算行业。去年智能手机出货量超过2亿,麒麟是其高端产品的重要核心。今年,鲲鹏加入了华为 beast行列,成为推动服务器计算生态的重要核心,这也代表了华为 积极布局更多商机。同时要掌握自己的计算核心技术,与世界同步,打造更广阔的开放生态。王者之心2点击试玩
2023-07-25 08:55:541

你应该选择哪个稳定的Linux内核版本?

Linux系统技术交流QQ群(1670392)验证问题答案:刘遄 Linux Kernel 的稳定分支维护者 Greg Kroah-Hartman 近日在其 个人博客 上谈及了关于稳定内核版本的选择。Kroah-Hartman 表示经常会有人咨询他们的产品/设备/笔记本电脑/服务器等应该使用哪个版本的稳定内核,但考虑到每个人的需求不同,各个版本的支持时间也有差异,所以答案并非固定。他试图用这篇文章来写下对此事的看法,以表达自己的观点。 Kroah-Hartman 列出了推荐使用的内核版本列表,从优至劣排序如下: 1.选择使用自己喜欢的发行版所支持的内核 2.最新的稳定版本 3.最新的 LTS 版本 4.还在维护的老 LTS 版本 Kroah-Hartman 解释称,对所有 Linux 用户来说,最明智的选择是使用自己喜欢的发行版中的内核。就个人而言,他更喜欢基于社区的 Linux 发行版,它们会不断推出最新的内核,并且会得到了社区的支持,不断打上补丁。这些发行版包括像是 Fedora、openSUSE、Arch、Gentoo、CoreOS 等。 最新的稳定版本则不用多说,大约每三个月,Linux 社区会发布一个新的稳定内核,其中包含所有最新的硬件支持,最新的性能改进,以及针对内核的最新 Bug 修正。 最新的 LTS 版本则相较更适合于一些嵌入式设备,无需担心每三个月发生一次“重大”升级。缺点是无法及时获得新内核中出现的性能改进,除非更新到下一个 LTS 版本。 一些更老的 LTS 版本则已经过社区考验,由于 Google、Linaro、kernelci.org 和其他公司的测试和基础设施的大量支持和投资,这些内核得到了更长时间的支持。使用这种内核实际上就代表你是独立的,最好是能够自己为内核提供支持。 也就是说,在适用性上,Kroah-Hartman 推荐: 笔记本电脑/台式机:最新的稳定版本 服务器:最新的稳定版本或最新的 LTS 版本 嵌入式设备:最新的 LTS 版本或更还在维护的老 LTS 版本 对于 Linux Kernel 的版本,你是怎么选的?欢迎评论。 原文来自: http://www.embeddedlinux.org.cn/emb-linux/industry-news/201808/27-8295.html 本文地址: https://www.linuxprobe.com/linux-stable-kernel.html 编辑:薛鹏旭,审核员:逄增宝
2023-07-25 08:56:011

华为是企业,但为什么感觉有那么多数学家、物理学家和化学家?

任正非在一次采访中表示,目前华为至少有 700 名数学家、800 多名物理学家、120 多名化学家、六七千名基础研究的专家以及六万多名工程师,这是华为近些年来快速发展的攻坚力量。 那么,华为作为一名企业,真的有那么多数学家、科学家吗?甚至有人说,华为的科研力量已经比清华北大、中科院等985高校和科研院所都强大了,事实真的如此吗? 这篇文章,站长就简单聊聊华为的科研力量。 华为的科研力量 01 华为的科研设施 和中科院一样,华为有遍布北京、上海、西安、南京和武汉等地的各大研究所,这些研究所的定位不同,负责的产品线也不一样: 南京研究所: 专注于业务软件,数据通信两大领域的解决方案和关键技术的研发。 上海研究所: 无线网络设备,终端旗舰智能手机,海思移动芯片产品和新能源业务。 杭州研究所: 智能摄像机、以及网络云研发。 北京研究所: 聚焦数据通信金属的研发。 武汉研究所: 背靠中国光谷,专注于光容量研发和终端研发。 西安研究所: 云计算,大数据,无线网络,固定网络,手机手表手链等领域。 成都研究所 :存储研发,无线二次研发,传输研发。 除了国内各大研究所外,华为还在 德国、瑞典斯德哥尔摩、美国达拉斯及硅谷、印度班加罗尔、俄罗斯莫斯科、日本、加拿大和土耳其 等国家建立了8个境外研究所,主要依托当地的大学进行产学研合作。 比如, 俄罗斯 在无线射频领域居于世界领先地位,华为早在1999年就在俄罗斯设立了数学研究所,吸引顶尖的俄罗斯数学家来参与华为的基础性研发。 2001年,华为在 硅谷和达拉斯 设立了两个研究所,因为美国是CDMA、数据通信和云计算的发源地。 随后,华为在 瑞典斯德哥尔摩 设立了3G技术研究所,因为瑞典是3G技术的发源地,这里的爱立信是3G技术的领导者。 此外,华为在 德国慕尼黑 的研究所现在已经拥有将近400名专家,研发团队本地化率达到了80%。 华为除了上述研究所外,还有一个直属总部的实验室——2012实验室 。这个实验室主要面向的是未来5-10年的发展方向的研究,比如新一代通信、云计算、音频视频分析、数据挖掘、机器学习等,2012实验室以世界著名的数学家命名,比如 香农实验室,高斯实验室、谢尔德实验室、欧拉实验室、图灵实验室 等。 02 华为的科研人员 截至2019年底,华为的全球员工总数高达19.4万人,其中科研人员约有9.6万人,占总人数的49%。 而在这9.6万明研发人员中,包括 700名数学家、800多名物理学家、120多名化学家、六七千名基础研究的专家以及六七万名工程师。 如此庞大的研发人员力量,比中科院的科研人员数量还要多(不过说实话,中科院的科研人员博士占比更高)。 截至2015年12月31日, 华为加入了300多个标准组织/产业联盟/开源社区, 担任超过280个重要职位, 在IEEE- SA、ETSI、WFA、TMF、OpenStack、Linaro、OASIS和CCSA等组织担任董事会成员。2014年提交标准提案超过4800篇,2015年提交提案超过5400 篇,累计提交提案43000余篇。 03 华为的研发投入 作为一个 科技 型企业,华为每年投入研发费用的 20%~30% 用于基础科学研究,去年有近 900 亿人民投入了研发,早就进入了研发开支世界前十的行列。 按照20%的基础研发占比来计算,意味着华为每年将有200亿左右的费用投入基础科学研究。 那么现在200亿左右的基础科学研究到底是个什么概念呢?下表是2017年国内大学科研经费的排名情况: 是的! 这个200亿元超过了国内科研经费TOP5大学的总和! 华为为什么要关注基础科学研究? 关于华为要招聘顶尖数学家和物理学家的原因,任正非在一次采访中给出了答案,那就是华为目前在通信领域已经超越了老牌公司,走在了最前面,按照任正非的话说就是已经进入了“无人区”。 而在这一阶段,通信技术要想在向前进一步,就要在数学和物理、化学等基础学科上下功夫,而不是局限于现有的理论进行缝缝补补。 而现在无论是国内高校还是国外高校,在这一领域都还没有可以直接拿来用的理论,所以华为只能招聘数学家自己去研究。 上面一图是华为任正非总裁接见了Polar码的发现者Erdal Arikan教授,并给他颁奖。 华为真的能比肩中科院和清北院校吗? 很多人认为,华为无论是在基础科学的资金投入、科研人员投入还是实验室数量上都颇具规模,甚至有人认为,华为的科研力量已经超过了中科院和清北一票高校,那么,事实真的如此吗? 科学驿站认为,事实并非如此。 华为作为一个公司,盈利是企业的基本目标,而基础科学研究并不像工程研究一样,可以在短时间内反哺工业设计,带来可预期的利润。无论是数学还是物理学,它们的研究成果可能要经过上百年的时间才能验证,而等到可以应用于产品,则又要经过上百年时间,能花这么上百年时间进行持续投入而不求利润回报的,只能是以财政作为支撑的科研院所。 这也就决定了华为任正非所说的数百名数学家也好,物理学家也好,绝大多数是工程应用型人才,重点在于帮助企业解决一些研发难题。而中科院的数学家则是进行理论研究和 探索 ,实际应用能力不强。 正如数学家 丘成桐 质疑华为有700名数学家的真实性一样,任正非所说的数学家应该只能算数学工程师,而不是真正的数学家。 所以,华为的研发能力是很强,但在理论研究方面,与中科院及清北高校相比还是逊色不少的,而我们目前最应该做好的,就是让像华为一样优秀的 科技 企业与科研院所通力合作,真正做到“产-学-研”的融合。 谢谢您的问题。华为有很多数学家、物理学家,说明任正非极其看重数学、物理等基础科学作用。 我们普遍认为物理学家,化学家,数学家都应该在大学课堂,研究所;而在企业,似乎难以理解。而在华为,至少有700名数学家、800多名物理学家、120多名化学家、六七千名基础研究的专家、六万多名各种高级工程师、工程师…… 华为,感觉就是“企业大学”,因为在华为18万的员工中,有8万研发人员,而在公司占比45%左右,而在十年的投入研发费用超过了3940亿元,可以说华为的研发从来没有停过。而,华为的物理学家,化学家,数学家等等,其实都是为了让华为能够在竞争中获得消费者的认可。 我们知道在1月24日,华为发布了5G基站芯片,天罡。而截止到24日,华为已经在世界签订了30份合同,出售了2.5万个基站。可以说华为的5G成果,是华为在这些年的沉淀而获得。任正非可以骄傲的对媒体说:全世界能把微波和5G同时做好的,只有华为。 其实,华为注重对数学家,物理学家,化学家的注重,更说明了华为对于研发的投入,而华为的发展并非一朝一夕的成就,它是是 科技 深耕,花大时间投入的结果,而重视教育就是一个企业能够长久深耕必须要坚持的内容。 应邀回答本行业问题。 华为是全球第一大通信制造业公司,一些通信方面的技术,华为的研发已经进入了无人区,需要更多的基础科学的支持,这也是为什么华为有这么多基础领域的科学家的原因。 说到华为的数学家,物理学家,化学家,就不得不提一下,曾经的通信业里的圣殿--贝尔实验室。 在通信业里,曾经有一个实验室,被称为通信业里的圣殿,那就是AT&T旗下的贝尔实验室。 贝尔实验室,是商业科研的顶峰,它曾经的地位,可以说是全部的通信业研发人员向往的圣地。 美国贝尔实验,是晶体管、激光器、太阳能电池、发光二极管、数字交换机、移动通信网络、数字计算机、通信卫星、长途电话网络、有声电影、立体声等多个影响人类文明进程的重大发明的发源地。 同时,计算机行业的UNIX和C语音也是出自贝尔实验室。 贝尔实验室一共获得了8次诺贝尔奖,其中7次是物理学奖,1次是化学奖。 无线天文学的发源地也是贝尔实验室。 通信业里比较公认的美国通信业的衰落的一个非常重大的原因,就是AT&T被拆分,而导致贝尔实验室研发资金不足,从此才开始了美国通信业失去了把持通信业发展方向的能力。 足够的利润足以支撑华为投入巨大的资金进行研发,而研发投入也是华为可以保持行业领先的关键。 华为是全球第一大通信制造业企业,在全球的通信业里具有非常高的地位。在多个涉及通信业的领域之中,华为都保持着全球领先的水平。 在当下最热门的5G领域,华为也保持着全球第一大的标准必要专利所有者的地位,这也是华为持续投入研发的结果。 而通信业的研发,是离不开数学、物理这些基础的理论的,数学和物理是通信业的基础。 而化学则是一次材料学的基础,对于华为的产品的性能也可以起到很强的促进作用,也让华为的产品的适应性更强大,现在华为的产品可以遍布全球,也有化学家的努力在里边。 总而言之,华为有着很高的利润,可以养的起很多的物理学家、数学家、化学家,而这些科学家的研发,也可以反哺华为,使得华为保持着通信业里的领先地位,这是一个互相依存,互相促进的共赢。 华为能有今天的伟大成就并非一朝一夕得来的,历经了常人难以想象的磨难!创始人任正非身患癌症、糖尿病等几种疾病,企业差点被自己培养的接班人、任正非最为器重的干儿子李一男打垮!任正非不止一次的想自杀,2003年华为卖身摩托罗拉的协议都签好了,摩托罗拉后来反悔了,华为诠释了一句名言:所有伟大的背后都是苦难! 华为很多年前年前就开始大规模投入研发了!华为真的是把欧美人喝咖啡、度假的时间用来埋头研发!多年的艰苦研发、从别人看不上眼的基础数学、基础物理、化学、算法、统计学开始孜孜不倦,历经千辛万苦,最后形成大量专利技术的积累,才有今天的厚积薄发,水到渠成! 华为拥有相当牛逼的、独一无二的财散人聚的利益分配机制,配合永远以客户为中心的价值观,佛挡杀佛、神挡杀神的凶猛的狼性文化,加上高薪水、巨额研发费用、巨额收入、高瞻远瞩的超前眼光、敏锐的市场嗅觉、划时代的企业战略、提前布局未来,企业竞争力达到了恐怖级别! 华为擅长整合全球最好的资源,这点也很厉害!华为聘请了世界生产管理最牛逼的丰田退休高管做精益生产顾问,述职制度是挖微软高管来搞的,高薪聘请了不少俄罗斯的世界顶级数学家!财务顾问是鼎鼎大名的世界四大会计师事务所之一的毕马威! 华为不仅仅手机、芯片、电信设备牛逼,华为在云计算、物联网、人工智能(AI)、大数据等新ICT领域持续创新,数据中心、企业园区、智简网络、全闪存、eLTE和企业通信方案在政府、能源、交通、金融、制造等行业得到广泛应用。 一个华为,带动了中国极其庞大的上下游产业链企业一起发展壮大!华为超过一半的收入来自海外!累计向国家上交的税收超过10000亿! 华为对中国的贡献没有任何一家公司能够相提并论!华为才是真正的最牛逼高 科技 公司,阿里、腾讯、百度、京东,倒下了,分分钟就会有公司取代,华为如果倒下了,没有任何公司可以取代!华为与苹果、高通等公司的竞争就是中国与美国的竞争!华为败,则中国败,华为胜则中国胜!支持华为!! 也感觉到了华为各类科学家或基础科研人员多,故参与作答,谢谢! 1 两个大不同 (1)基础科研队伍 各类基础科研人员多,明显多于不少其他中国 科技 企业,在华为里,围绕着通信主业,置身科研领域前端,与其他科研人员构成了1个实际存在的科研院,又共同与非科研人员组成了1个企业。 各类基础科研作用大,明显大于不少其他中国 科技 企业,有共知的成果和其转化应用为证。 (2)整体 科技 实力 正是由于科研院的存在和作用,特别是由于有基础科研作深层的支撑,华为才成为了1家货真价实且又底蕴深厚、领先世界的高 科技 公司,才能够在1个世界高 科技 最强的国家限制之际,实时亮出高 科技 的备胎,还不止一个。 而之所以被限制,正是因为之前亮出了早就转正的更先进技术和更高端产品。 华为,远不止与几个世界高 科技 巨头企业在作对决! 查查中国 历史 ,有没有出过这样大不相同的企业? 2 两个很相同 史上、当下,也有在总体人员构成、基本运行模式上与华为相同,进而技术先进、产品高端的中国 科技 企业或集团公司,只是一直少。 世界上则多,如空客、波音、洛克希德、高通、苹果、三星。 但是,无论中外,都还没有作为1家企业被最强1国那般地限制以及被多个强国围堵过,华为被限制和围堵后才崭露头角,凸显出前面的两大不同。 3 最主要原因 (1)与华为相同的 华为与一些中国 科技 企业有上边的两个很相同,怎么看? 概而言之,应该说都与远见卓识没多大关联,华为与相同的中国 科技 企业都明白其中的道理,也就是为什么要组成科研、制造以及销售三结合、全链条的企业集团。 对具体道理这里就不用说了,局外人也普遍清楚。 (2)与华为不同的 不少 科技 和高 科技 的民企与国企,即使创立总年头比华为长很多、队伍总规模比华为大很多, 科技 尤其高 科技 的实力和贡献也根本比不过华为。 主要原因是什么? 对基础科研,口头说重要、实际作次要以至不要,于是,对基础科研人员也是这样,置于边缘,甚至闲置,更不予激励,以至连待遇都不及其他科研人员的。 对建立基础科研队伍、进行基础科研的目的很清楚,对基础科学及其综合与现代科学和髙 科技 的关系也都明白,只是,都没有实际地落实,或没有较好地落地。 华为是企业,但是为什么会有那么多的数学家,物理学家和化学家呢?对于一家企业而言,它需要的是盈利,而不是基础的研究,但是华为明显不同,更加注重基础学科的作用,这就是华为的伟大之处,能以敏锐的目光洞察到没有到来的一些事情。 我们都知道,一家高 科技 企业的发展是离不开人才的,而华为的发展则是因为全球的人才汇聚到了华为,对于硬件和算法这个非常具有难度的问题来说,算法一直是华为产品的核心竞争力,这也是为什么华为这么多年以来一直坚持发展算法,发展基础学科的根本原因了。 而且在前段时间,华为总裁任正非在接受央视采访的时候就说过,人类 社会 进步的道路,是基于基础的学科的,这里面包括的范围很广的,比如说物理,化学,数学,这些都是最为基本的基础学科。 华为任正非最近在接受中央台采访时说,华为有700多数学家、800多物理学家、120多个化学家。华为为什么需要这么多基础学科的科学家呢?这确实让很多人感觉到震惊和纳闷! 在一般人的印象中,基础学科的科学家都是在大学、研究所做教学、研究工作,企业里最多就是一些搞应用 科技 的工程师。但想不到华为公司有那么多基础学科里的科学家!这在我国民营企业里确实是很少见的。但这个情况在欧美一些跨国公司里并不少见。 企业虽然是以做产品为目的,但作为某个领域的领头羊,要想作技术的领导者和创新者,就必然会遇到一些 科技 难题需要自己突破,而真正的发明创造都需要基础学科知识的支持。应用技术都是建立在基础学科的研究基础上的。如果企业遇到基础学科上问题都向大专院校和科研机构求助,不仅效率低,而且因此而形成的专利技术产权也难以界定。华为立志做通讯行业里的创新先锋,面临美国的技术封锁和打压,必须立足自己解决 科技 创新过程中遇到的复杂难题。例如要解决网络大数据的作用,就需要数学和统计学方面的专家支持;要解决手机和机站硬件设施的一些质量问题,就可能用到物理学家和化学家。特别是一些通讯领域新材料的应用,更需要大量的化学家的支持。 因此,只要你想成为某个领域里的开拓者和领导者,招收一定数量的基础学科领域的科学家是非常必要的。愿我们有更多像华为这样的企业,胸怀大志,广纳贤达,成为世界上更多行业的领导者。只有这样,中华民族的伟大复兴才不是一个梦! 任正非表示:华为至少有 700 名数学家、800 多名物理学家、120 多名化学家、六七千名基础研究的专家、六万多名各种高级工程师、工程师。 华为这样的配置,是因为前沿的技术研究,需要学术的推动! 你要知道,华为的技术在通讯领域上已经是全球顶尖的了了,尤其是通讯设备商中,华为的实力是最强的。 这就意味着一个问题,你是在最前沿了,完全没有任何的问题人可以教你了。只能靠你自己去研发,自己摸索。 所以华为需要数学家、物理学家、化学家等专家去研究基础学科,研究最新的结果,并且把需要基础的研究员把成果转化为商业机会。 这也是任正非重视基础研究的原因,因为我们很多技术都在基础学科上演变过来的,演变总有尽头,如果基础研究和基础学科不突破的话,这是没有办法再在技术上进行突破的。 所以,华为需要这么多的数学家、物理学家、化学家等专家去研究。 华为任正非在接受“ 面对面 ”专访的时候,专门解答了这个问题。 华为不仅仅在人员构成上偏向于研发,并且每年研发的经费也在逐年递增,2018年的研发费用已经高达千亿元。正因如此, 科技 研发给华为的发展提供了足够的动机,即便在美国的封锁打压之下,华为依然可以稳步的向前发展。 科研是华为的发展基石,立足之本,一起来看看任正非是如何说的吧! 任正非对于华为拥有众多科学家的看法 任正非在“面对面”专访时谈到,华为公司有700多个数学家、800多个物理学家、120多个化学家,还有六千多为专门在基础研究的专家,六万多名工程师。那么,华为为何要储备如此多的科学家呢? 任正非认为正常的研发顺序应该是由科研机构、大学高校提供理论依据之后,交给企业、公司去进行实践,开发出最终的产品。但是,华为发展速度较快,科研机构以及高校研发的速度相对滞后,华为只能够通过自身来进行理论研究。 华为对于人才的重视 华为充分认识到人才对于公司的重要性,2019年华为将会从全世界招聘20至30名天才少年,2020年预计将会从世界招聘200至300名。前不久华为就已经招聘到了八位天才少年,年薪基本在百万之上,可见华为对于人才的重视程度。 华为的人才并非是纯粹的理论学者 丘成桐认为华为公司的700名数学家并不符合真正意义上的数学家,只能够是通过数学来解决工程问题的数学工程师。当然,这里存在着对于数学家定义的不同理解。能够看出华为的人才并非是纯粹的理论学者,而是能够将理论转化为工程应用的应用型人才。 无论如何,华为能够实现高速发展与这些科学家密不可分,与华为重视人才的战略密不可分,与华为高额的研发投入密不可分。 关于华为拥有众多科学家的事情,您怎么看?
2023-07-25 08:56:081

Android 进程管理篇(五)-调度策略与优先级

接上篇cpuset,这篇来看看进程优先级与调度策略管理。 Linux中,优先级号一共有0-139,其中0-99的是RT(实时)进程,100-139的是非实时进程。 数字越低优先级越高。 SCHED_IDLE idle状态低优先级进程调度 先看Process中调度策略的划分,与上面介绍的一样。 首先在AMS中封装了FIFO和NORMAL的两个策略,NORMAL好说,看看FIFO在哪用到 这里Process.setThreadScheduler并没有太多的应用,我们直接来看优先级设置吧。else中将top app的UI线程与render线程都设置为TOP_APP_PRIORITY_BOOST优先级,nice值为-10,非常高。 这里主要调用androidSetThreadPriority方法 这里通过set_sched_policy来调整调度策略,并通过setpriority设置进程优先级。这里不特意区分进程与线程了,反正在linux中都是进程。 这里与前面的cpuset非常相似,依然是写节点,节点前面也提了就是: 那么这里又引入了一个schedtune子系统,简单介绍下: schedtune是ARM/Linaro为了EAS新增的一个子系统,主要用来控制进程调度选择CPU以及boost触发。通过权重来分配CPU负载能力来实现快速运行。高权重意味着会享受到更好的cpu负载来处理对应的任务,换句话说你能享受相对更好的cpu运行性能。 简单梳理下schedtune和不同类型SchedPolicy之间的对应关系: 看下具体文件夹内容: 系统配置: 这里/dev/stune相关配置只做了这么一个
2023-07-25 08:56:291

华为鸿蒙多次邀请,却无人敢接!网友:这是烫手山芋?

对鸿蒙开源系统(OpenHarmony OS),不少人一直有个误解。 那就是认为是华为的,所以那几家中国手机厂商不用鸿蒙开源系统可以理解,他们觉得如果用了鸿蒙开源系统,会受到华为的影响甚至控制? 不错,在捐献给开放原子开源基金会之前,鸿蒙系统就是华为花费巨大投入、独家开发的。 但在华为 捐出鸿蒙开源系统之后, 华为对鸿蒙开源系统就没了任何控制权,华为的身份,已成为鸿蒙开源系统开发贡献者之一。华为可以,而且当然还会继续为鸿蒙开源系统贡献开发成果,但却 没有了任何控制权。 开放原子开源基金会是致力于推动全球开源产业发展的非营利机构,由阿里巴巴、百度、华为、浪潮、360、腾讯、招商银行等多家龙头 科技 企业联合发起,于2020年6月登记成立,“立足中国、面向世界”,是我国在开源领域的首个基金会。 任何人任何企业,只要依据开源协议,都可以自由使用鸿蒙开源系统,就像安卓开源系统、Linux开源系统一样。 简单的举个例子,假设小米也成为了鸿蒙开源系统的开发贡献者,或者小米也开发了一个基于鸿蒙开源系统的类似于MIUI的手机操作系统,那么小米的地位和华为就是完全平等的。 小米这个操作系统,也就和华为手机搭载的HarmonyOS 2完全平等。 华为是OpenHarmony开源项目的共建者、也是共享者之一。 HarmonyOS 2是华为基于开源项目OpenHarmony 2.0开发的面向多种全场景智能设备的商用版本。华为不仅是OpenHarmony开源项目的主要贡献者,也是AOSP、Linux、Linaro、Eclipse等众多开源项目的贡献者,一直以来华为都严格遵循了相应的开源许可规则。 华为还表示,为保护华为现有和平板用户的数字资产,HarmonyOS 2实现了现有Android生态应用在部分搭载该系统设备上的运行。 未来华为将持续推动发展鸿蒙生态,让合作伙伴快速开发更有竞争力的智能硬件产品和服务,为消费者带来更好的体验。 当前华为已与合作伙伴开发了众多创新鸿蒙生态产品,包括智能家居设备、智能运动 健康 设备、智能办公设备等。 老王觉得鸿蒙系统短期可能对手机行业格局影响不大,但长期来看,鸿蒙系统可以应用到全场景终端设备上,实现跨终端协同、车机互联、可穿戴设备互联,是华为生态拓展的关键一步和物联网时代的重要布局。 那华为为何要将鸿蒙操作系统捐出去?那华为就直接说一个“大冤种”。 没有出来的时候,说是PPT OS;出来了,说是安卓套娃。 没有捐出来,说你一家独大想搞技术垄断;捐出来了,又质疑你是真捐还是假捐;自己家用,说你降维打击国。 对于同行;提倡大家一起用,说你居心叵测;你一言不发,说你心虚;你要汇聚星星之火,又说你痴心妄想凭什么? 没有源代码,说你为什么有Android的痕迹;有了源代码,问你为什么不能兼容安卓…… 鸿蒙HarmonyOS 2面世后,一度引发各界不同的声音,甚至部分友商公开表示不会使用鸿蒙操作系统。 业界还流传着其他手机友商对鸿蒙的评论: OPPO:在手机业务上,华为是竞争对手,不能将自己的命运掌握在别人的手上。 小米:华为目前正处于美国的制裁之中,而小米又严重依赖高通芯片,为了规避风险,暂不考虑鸿蒙。 荣耀:安卓仍然是首选,但随着时代的发展,不排除使用鸿蒙。 在这样的大背景下,华为在最新内部通知文件中再度重申了鸿蒙的定位。 通知提到,关于“鸿蒙操作系统”,由于缺乏规范的表述和统一的口径,导致内部理解不一致、对外说法不一致,容易引起混淆。为了规范鸿蒙沟通口径,经CBG讨论形成HarmonyOS对内对外沟通统一口径。 其实Openharmony 和 HarmonyOS(鸿蒙操作系统) 是两个完全不同的概念。 华为把HarmonyOS中基础功能提取出来,打包成功一个项目叫做“Openharmony” ,把Openharmony捐献给了原子开源基金会。 而华为自己的商业版本HarmonyOS 2 并没有捐出,这个商业版本也是基于开源项目 OpenHarmony 2.0 开发的,兼容了 AOSP,增加了 HMS 。 而理解了其中的关系,也能理解其他友商为什么不愿意用鸿蒙。一旦你用了鸿蒙,就等于放弃了安卓,而如果鸿蒙在生态产业链上超越不了安卓,就很可能被安卓干掉,塞班以及微软的手机操作系统就是活生生的例子。 而且如果要小米OV都兼容鸿蒙,他们还需要做于 Openharmony 2 开发自己的 UI。比如 MIUI + 兼容以前应用,工作量巨大,可能不是一时半会就可以搞定,同时他们还需要考虑谷歌在国外对他们制裁的风险。 如果各大手机厂家都用着完全相同的一个系统,甚至连LOGO都一样,而且其开发还是依赖于华为,那么其它手机厂家的实力怎么体现?独有特色怎么体现?卖点是什么? 很显然,基于同样的鸿蒙开源系统(OpenHarmony OS)没有太大问题,这就与目前安卓系各手机品牌的系统底层一样、但上层各有不同相类似。但是让其它手机品牌直接搭载华为原装的HarmonyOS 2,他们自己也不乐意。 —————— 公众号【鸿蒙开发者老王】,专注分享鸿蒙开发干货知识。
2023-07-25 08:56:351

华为欧拉系统可以下载了吗?

华为欧拉系统(EulerOS),华为继鸿蒙操作系统后,又推出了第二款自主研发的操作系统欧拉(EulerOS),欧拉系统是一款基于Linux平台的一个原生态操作系统工具,用户可以在这里进行更开阔的编程环境体验,帮助更多国内优秀程序开发师展示自我,共创一个出色的操作系统环境。华为欧拉系统与鸿蒙系统将相互协作,生态共通。本次带来华为欧拉系统下载,PDF格式文档,帮您快速了解消化,想要尝鲜体验安装最新华为欧拉操作系统的朋友们不要错过哦!Space华为欧拉系统(EulerOS)华为欧拉系统介绍OpenEuler 是一个开源、免费的 Linux 发行版平台,将通过开放的社区形式与全球的开发者共同构建一个开放、多元和架构包容的软件生态体系。同时,OpenEuler 也是一个创新的平台,鼓励任何人在该平台上提出新想法、开拓新思路、实践新方案。欧拉的定位是瞄准国家数字基础设施的操作系统和生态底座,承担着支撑构建领先、可靠、安全的数字基础的历史使命。未来欧拉将定位为数字基础设施开源系统,覆盖全场景应用,支持服务器,云计算,边缘计算,嵌入式多样性设备。OpenEuler与OpenHarmony将能力共享、生态互通。目前两个操作系统的内核技术已经共享,未来还将在安全OS,编程语言,设备驱动框架,分布式软总线方面能力共享。华为欧拉系统优势1.全面支持鲲鹏处理器EulerOS是目前支持TaiShan服务器最好的操作系统之一,在性能、兼容性、功耗等方面具备较强的竞争力,持续推动鲲鹏处理器的生态构建。- 提升多核并发能力,增强业务性能;L2 Cache共享技术,提升不同OSD进程间访问效率;首次在鲲鹏处理器架构内实现内核热补丁。- 通过和Linaro及绿色产业联盟合作,联合构建绿色计算生态联盟,促进鲲鹏生态发展。- 通过鲲鹏处理器的关键特性使能,实现了核心业务场景性能突破,并在Linux内核、虚拟化、GCC、OpenJDK及Docker等开源社区持续贡献,催熟产业生态。2.高安全EulerOS是目前最安全的操作系统之一,能够提供各种安全技术以防止入侵,保障您的系统安全。- 可配置加固策略。- 内核级OS安全能力。- 通过公安部信息安全技术操作系统安全技术要求认证。- 通过德国BSI PP标准的CC EAL4+认证。- 通过美国NIAP PP标准的CC EAL2+认证。- 通过美国NISTCAVP密码算法认证。- 支持业界主流的安全漏扫工具。3.高可靠、高可用、高保障EulerOS在标准资质、RAS特性方面为客户业务系统提供了高可靠性和高稳定性技术保障,同时通过技术维护团队的7 * 24小时的服务保障体系,让客户没有后顾之忧。- 故障管理(故障预测、分析、纠正、隔离)。- 设备热插拔(支持设备动态调整、在线设备维护)。- 软件故障修复(内核/用户态热补丁)。- 7*24的服务保障体系(定制、调测、补丁升级、现场)。- Unix03、LSB、IPv6 Ready、GB18030等行业标准认证体系。4.高性能EulerOS在编译系统、虚拟存储系统、CPU调度、IO驱动、网络和文件系统等方面进行改进与优化,使之成为一个高性能的操作系统平台,满足客户业务系统的高负载需求。相关新闻9月25日,在华为全联接2021上,面向数字基础设施的开源操作系统欧拉(OpenEuler)全新发布。欧拉操作系统可广泛部署于服务器、云计算、边缘计算、嵌入式等各种形态设备,应用场景覆盖IT(Information Technology)、CT(Communication Technology)和OT(Operational Technology),实现统一操作系统支持多设备,应用一次开发覆盖全场景。欧拉全新发布Space华为欧拉系统(EulerOS)华为计算产品线总裁邓泰华表示,操作系统“碎片化”现状,导致数字基础设施产生大量“软烟囱”,带来生态割裂、应用重复开发、协同繁琐的挑战,数字化新时代,呼唤新的统一操作系统。在ICT领域,华为提供服务器、存储、云服务、边缘计算、基站、路由器、工业控制等产品和解决方案,都需要搭载操作系统,所以华为一直在构建能力,旨在通过统一的操作系统架构来满足不同应用场景的需求。本次欧拉全新升级,同时支持服务器、云计算、边缘计算、嵌入式等各种形态设备的需求。支持多样性计算,致力于提供安全、稳定、易用的操作系统;并通过为应用提供确定性保障能力,支持OT领域应用及OT与ICT的融合。至此全新发布的欧拉操作系统可覆盖从IT、CT到OT数字基础设施全场景。
2023-07-25 08:56:554

简述一下编译器和链接器的作用?

  1、编译器:  编译器对源文件进行编译,就是把源文件中的文本形式存在的源代码翻译成机器语言形式的目标文件的过程,在这个过程中,编译器会进行一系列的语法检查。如果编译通过,就会把对应的CPP转换成OBJ文件。  2、链接器:  当链接器进行链接的时候,首先决定各个目标文件在最终可执行文件里的位置。然后访问所有目标文件的地址重定义表,对其中记录的地址进行重定向(加上一个偏移量,即该编译单元在可执行文件上的起始地址)。  然后遍历所有目标文件的未解决符号表,并且在所有的导出符号表里查找匹配的符号,并在未解决符号表中所记录的位置上填写实现地址。最后把所有的目标文件的内容写在各自的位置上,再作一些另的工作,就生成一个可执行文件。
2023-07-25 08:57:033

小米路由器怎么安装路由宝插件

在路由宝上换成潘多拉的,目的就是为了能够多拨,把小水管放大点。没事时再挖点小钱。在网上查了教程,感觉挺简单,实际安装时就不是了。openwrt以前接触很少,安装命令都是命令行,有点难度。在安装路由宝插件时,按教程里命令放到putty中死活就是不行。这就是网上的:opkg –force-depends –force-overwrite install /tmp/libogg.so.0.ipkopkg –force-depends –force-overwrite install /tmp/libstdcpp_4.6-linaro-1_ralink.ipkopkg –force-depends –force-overwrite install /tmp/luci-app-youku_ramips_24kec.ipk就是简单的命令行,但就是不行,哪里的问题呢?仔细看帮助,再做测试 ,明白了,应该是这样的:opkg --force-depends --force-overwrite install /tmp/luci-app-youku_ramips_24kec.ipkopkg --force-depends --force-overwrite install /tmp/libstdcpp_4.6-linaro-1_ralink.ipkopkg --force-depends --force-overwrite install /tmp/libogg.so.0.ipk这样安装就成功了!另外:--force-depends 这个选项是强制安装 --force-overwrite 这个是覆盖安装
2023-07-25 08:57:113

Linux version 4.19.90-20 (YHKYLIN-OS@TopSecSystem)镜像哪里可以下载?

这个版本的Linux内核看起来是TopSec System镜像中自带的。如果您需要下载该版本的Linux内核,请到TopSec System官网上寻找更多信息。另外,您也可以在Linux内核官方网站上找到并下载4.19.90版本的内核镜像,但这并不一定与TopSec System使用的内核完全一致。
2023-07-25 08:57:181

win7上怎么用qemu模拟arm环境

  使用Qemu模拟Cortex-A9运行U-boot和Linux 作者来源于网络  我的开发环境: Ubuntu-12.04 所有软件包为最新  1. 安装GNU工具链  sudo apt-get insatll gcc-arm-linux-gnueabi  sudo apt-get insatll g++-arm-linux-gnueabi  安装完成后会在 /usr/arm-linux-gnueabi/ 目录下生成库文件、头文件等。 我安装的GCC版本为:  arm-linux-gnueabi-gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3  Copyright (C) 2011 Free Software Foundation, Inc.  2. 安装Qemu模拟器  sudo apt-get install qemu qemu-system qemu-utils  这时应该已经可以运行qemu-system-arm命令了, 其版本为:  qemu-system-arm --version  QEMU emulator version 1.0.50 (Debian 1.0.50-2012.03-0ubuntu2), Copyright (c) 2003-2008 Fabrice Bellard  3. 编译和运行U-boot:  到 ftp://ftp.denx.de/pub/u-boot/ 下载最新版本的U-Boot源代码, 我用的目前最新版本 u-boot-2012.04.tar.bz2  解压后进入源代码目录,在Makefile里面增加两行:  ARCH ?= arm  CROSS_COMPILE ?= arm-linux-gnueabi-  其实就是告诉它使用ARM编译器来编译。  make ca9x4_ct_vxp_config  make  这里配置目标板为 Cortex-A9x4 vexpress. 之所以选这个配置可以从 boards.cfg文件里看到, vexpress是ARM公司使用Cortext-A9的一个开发板,相关的代码在 board/armltd/vexpress/ 目录,配置文件为include/configs/ca9x4_ct_vxp.h。 而且关键的是Qemu里面已经支持这个板卡。  编译完成后会生成u-boot文件  运行:  qemu-system-arm -M vexpress-a9 -m 256M -nographic -kernel u-boot  或者  qemu-system-arm -M vexpress-a9 -m 256M -serial stdio -kernel u-boot  发现,如果没有指定-nographics, 则必须要加-serial stdio才会有打印。  参数-m 256M为指定内存大小。-M 指定板卡的名称, 支持的板卡可以用-M ?查看, 如下:  #qemu-system-arm -M ?  Supported machines are:  beagle Beagle board (OMAP3530)  beaglexm Beagle board XM (OMAP3630)  ............  versatilepb ARM Versatile/PB (ARM926EJ-S)  versatileab ARM Versatile/AB (ARM926EJ-S)  vexpress-a9 ARM Versatile Express for Cortex-A9  vexpress-a15 ARM Versatile Express for Cortex-A15  正常运行的结果:  qemu-system-arm -M vexpress-a9 -m 256M -nographic -kernel u-boot  U-Boot 2012.04 (Jul 08 2012 - 00:14:08)  DRAM: 256 MiB  WARNING: Caches not enabled  Flash: ## Unknown flash on Bank 1 - Size = 0x00000000 = 0 MB  ## Unknown flash on Bank 2 - Size = 0x00000000 = 0 MB  *** failed ***  MMC: MMC: 0  *** Warning - bad CRC, using default environment  In: serial  Out: serial  Err: serial  Net: smc911x-0  Hit any key to stop autoboot: 0  VExpress#  VExpress# printenv  baudrate=38400  bootcmd=run bootflash;  bootdelay=2  bootflash=run flashargs; cp ${ramdisk_addr} ${ramdisk_addr_r} ${maxramdisk}; bootm ${kernel_addr} ${ramdisk_addr_r}  console=ttyAMA0,38400n8  。。。。。  注意:如果在检测Flash failed后停止运行,是因为在 arch/arm/lib/board.c里面 board_init_r()函数里检测Flash失败后调用了hang(), 暂时先把hang()去掉就可以运行下去了。
2023-07-25 08:57:261

arm-linux-gcc 和 arm-elf-gcc 的区别

在基于ARM的嵌入式系统开发中,常常用到交叉编译的GCC工具链有两种:arm-linux-*和 arm-elf-*,两者区别主要在于使用不同的C库文件。arm-linux-*使用GNU的Glibc,而arm-elf-*一般使用 uClibc/uC-libc或者使用REDHAT专门为嵌入式系统的开发的C库newlib.Glibc。uClibc/uC-libc以及 newlib都是C语言库文件,只是所应用的领域不同而已,Glibc是针对PC开发的,uClibc/uC-libc是与Glibc API兼容的小型化C语言库,实现了Glibc部分功能。  关于uClibc/uC-libc的说明,详见如下:  There are two libc libraries commonly used with uClinux. uC-libc anduClibc. They are quite different despite their similar names. Here is aquick overview of how they are different.  uC-libc is the original library for uClinux. It was based on sourcesfrom the Linux-8086 C library which was part of the ELKs project with m68000support added by Jeff Dionne and Kenneth Albanowski. It is a fairly completelibc implementation, however, some of the API"s are a little non-standardand quite a few common libc routines are not present. Currently it hasstable support for m68000, ColdFire and ARM (Non-MMU) architectures. It wasprimary design goal is to be small and light weight. It does try to conformto any standards, although its API tries to be compatible with most libcs,it is not always exactly the same.  The uClinux distribution provides an environment that can compile usingeither uC-libc or uClibc depending on your needs. For m68000 and Coldfireplatforms it is generally better to chose uC-libc as it supports sharedlibraries and is the most commonly used libc for these CPUs. uClibc alsoworks quite well with almost all platforms supported by the distribution.Which libc you choose to use will be decided by your requirementsuClinux有两个经常使用的libc库:uC-libc和uClibc。虽然两者名字很相似,其实有差别,下面就简单的介绍一下二者的不同之处。uC -libc是最早为uClinux开发的库,是Jeff Dionne和Kenneth Albanowski为在EKLs项目中支持m68000在Linux-8086 C库源码上移植的。uC-libc是一个完全的libc实现,但其中有一些api是非标准的,有些libc的标准也没有实现。uC-libc稳定地支持 m68000,ColdFire和没有MMU的ARM。其主要设计目标是“小”、"轻",并尽量与标准一致,虽然它的API和很多libc兼容,但是似乎并不像它期望的那样和所有标准一致。uClibc就是为了解决这个问题从uC-libc中发展出来的。它的所有API都是标准的(正确的返回类型,参数等等),它弥补了uC-libc中没有实现的libc标准,现在已经被移植到多种架构中。一般来讲,它尽量兼容glibc以便使应用程序用uClibc改写变的容易。uClibc能够在标准的 VM linux和uClinux上面使用。为了应用程序的简洁,它甚至可以在许多支持MMU的平台上被编译成共享库。Erik Anderson在uClibc背后做了很多的工作。uClibc支持许多系列的处理器:m68000,Coldfire,ARM,MIPS,v850, x86,i960,Sparc,SuperH,Alpha,PowerPC和Hitachi 8。不断增加的平台支持显示uClibc能够很容易的适应新的架构。uClinux发行版提供了环境能够让你选择使用uC-libc或是uClibc编译。对于m68000和Coldfire平台来说,选择uC-libc还是稍微好一点,因为它支持共享库,而共享库是这些cpu经常使用的 libc.uClibc也几乎和所有的平台都能很好的工作。选择哪种libc取决于你的需求。newlib 是一个用于嵌入式系统的开放源代码的C语言程序库,由libc和libm两个库组成,特点是轻量级,速度快,可移植到很多CPU结构上。newlib实现了许多复杂的功能,包括字符串支持,浮点运算,内存分配(如malloc)和I/O流函数(printf,fprinf()等等)。其中libc提供了c 语言库的实现,而libm提供了浮点运算支持。在为ARM交叉编译gcc编译器时,对gcc指定不同的配置选项时,使用的C语言库就不同,gcc编译器默认使用Glibc,也可以使用 uClibc/uC-libc(基本兼容Glibc API),当使用--with-newlib时,gcc编译器不使用Glibc。当没有交叉编译Glibc时,可以使用--with-newlib禁止连接Glibc而编译bootstrap gcc编译器。从gcc源目录下的config/arm中的t-linux和t-arm-elf中可以看出,不同的--target也影响gcc连接C语言库,t-linux(--target=arm-linux)默认使用Glibc,-arm-elf(--target=arm-elf)使用- Dinhibit_libc禁止连接Glibc,这时我们就可以使用newlib等其他C语言库编译GCC工具链。虽然GCC工具链配置了不同的的C语言库,但由于这些C语言库都可以用来支持GCC,它们对核心数据的处理上不存在较大出入。因而arm-linux-* 和 arm-elf-*区别主要表现在C语言库的实现上,例如不同系统调用,不同的函数集实现,不同的ABI启动代码以及不同系统特性等微小的差别。arm-linux-*和 arm-elf-*的使用没有一个绝对的标准,排除不同库实现的差异,gcc可以编译任何系统。arm-linux-*和 arm-elf-*都可以用来编译裸机程序和操作系统,只是在遵循下面的描述时系统程序显得更加协调:arm-linux-*针对运行linux的ARM机器,其依赖于指定的C语言库Glibc,因为同样使用Glibc的linux而使得arm-linux-*在运行linux的ARM机器上编译显得更加和谐。arm-elf-*则是一个独立的编译体系,不依赖于指定的C语言库Glibc,可以使用newlib等其他C语言库,不要求操作系统支持,当其使用为嵌入式系统而设计的一些轻巧的C语言库时编译裸机程序(没有linux等大型操作系统的程序),如监控程序,bootloader等能使得系统程序更加小巧快捷。Linaro prebuilt toolchain does support both hard and soft floatingpoint. You can get it from https://launchpad.net/linaro-toolchain-binaries/+milestone/2012.08 try: ./arm-linux-gnueabihf-gcc -print-multi-libThe default configure is --with-arch=armv7-a --with-tune=cortex-a9--with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumbTo use soft floating, you need options: -marm -march=armv4t -mfloat-abi=soft.In your case, please try to change -march=armv5 to "-march=armv4t"If you want to change to configure to cortex-a8 and armv5. You need* Change cortex-a9 to cortex-a8 insamples/linaro-arm-linux-gnueabihf/crosstool.config* Change armv4t to armv5 incontrib/linaro/patches/gcc/linaro-4.7-2012.08/multilib.patch,Then follow the instructions to rebuild the toolchain(contrib/linaro/doc/README.txt)BTW: crosstool-ng-linaro does not support multilib for eglibc. It usesthe prebuilt sysroot from Ubuntu Precise. If it does not work for you,please use the latest crosstool-ng from http://crosstool-ng.org/.
2023-07-25 08:57:341

一 . 树莓派A20 基本环境搭建 1

我的实验环境: 1.交叉编译工具链:gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux(4.8.2).tar.xz 2.SDK文件:MarsBoard-A20-Linux-SDK-V1.1.tar.bz2 在安装gcc-arm-linux-gnueabi的时候,会自动安装上gcc-4.6-arm-linux-gnueabi,如下图所示: 第二个文件的安装很重要,尽管后面提示的编译错误,缺少的是arm-linux-...,但是安装这个文件还是挺好用的。 根据前面安装的一些安装包,其实本节的交叉编译工具链可以不用操作。因为已经包含了本节所做的了。 我得先将vim改一下,否则按住上下左右,会出现A,B,C,D。 再/etc/profile最后一行添加内容: 然后: 这里做一些简要的说明,在网址: 链接 上有一些说明,从说明中,我们可以看到我们用的sdk的架构。 pack文件夹 选择2,server版本。 之后: 能找到的livesuit_marsboard_a20_debian.img就是生成的镜像文件。如果要修改名字,可以: 这里面就包含了image.cfg,找到里面的一项: 修改为其他的名字即可。 选择2,server版本。 1.若出现如下报错: 可以: 如果出现: 但是其实这些文件都是有的,可以不妨: 再次编译,则问题如下: 仔细找编译的shell输出文件,发现是rootfs/下的gz文件找不到,这是因为我做前面的操作的时候,希望生成自己的rootfs_my.tar.gz文件。现在我重新将该文件放到rootfs/下,再次编译,我将最后的结果放在下面: 这样表示成功了。 下面列入生成的镜像: livesuit_superpi3.img即是。 1.我在做上面的操作的时候,夹杂的使用了两个开发板,一个是marsboard出品的a20开发板,另外一个是风火轮出品的a20树莓派3卡片电脑,说实在的,看起来风火轮附带板子资料挺多,但是其真正写的资料可没用心做,实在不是一个榜样,在该开发板上做非核心开发,是可以的,但是做研发,还是需要做考量。 烧写成功后,打印的内容如下,作为日志信息,留作以后分析:
2023-07-25 08:57:411

安卓系统支部支持intel处理器

安卓系统有两大分支,一个是基于arm的,一个是基于x86的,x86的安卓系统可以在英特尔处理器平台上运行,而且x86可以通过模拟器运行基于arm的安卓版本。
2023-07-25 08:58:037

馥蕾诗品牌介绍

馥蕾诗品牌介绍:是法国LVMH集团旗下的高端护肤品牌。带有浓厚人文色彩的fresh相信,人类几百年的文化智慧是美颜的宝贵遗产,不需要改变,只需要改良。fresh把世界各地民族流传的古老美容秘方,结合现代人的喜好习惯,重新调配成适合日常使用的护肤系列。比如:玫瑰,红茶,大豆,澄糖等。Fresh因独特的新旧融合,在业界自成一格,并反映在怀旧包装与恬静色彩中,渗透一份摩登的简约美学。牛奶系列用上古朴的半透明牛奶瓶;泡泡浴设计成一块块方糖,用磨砂圆筒盛载;香水瓶像旧时人的洗涤水或花露水瓶。面部保养品罐拥有白瓷手感;工笔画素花图案,深具细腻的东方色彩;手工造沐浴香皂,素面印度麻纸包装,手工扭上铅丝珠花,更缀上一枚半宝石;还与电影“艺伎回忆录”合作,推出“樱花”限量系列。馥蕾诗发展历程:Fresh的创业史像一个典型的“美国梦”。创始人LevGlazman与AlinaRoytberg夫妇来自前苏联俄罗斯及乌克兰,年少时与家人移民美国东岸。创始人Lev对香味极有天分,创始人Alina毕业于纽约Parson时装学院,与MarcJacobs是同学。两人先在Boston(波士顿)经营一间小洗衣店,1991年售卖一组精美的手造沐浴香皂OverSoap,几天内销售一空,迅速在美容圈内打响名堂,开创Fresh,并奠定高级美容沐浴护肤品牌地位。2000年被LVMH收购后,诞生彩妆。自2001年推出全套化妆品和2002年春推出新式护发产品以来,Fresh 已完成从沐浴与美体用品公司到美容与化妆品公司的转变,可充分满足独具慧眼的客户的需求。Fresh的360多家分店遍布世界各地:产品系列包括护肤保养、身体护理、香水、化妆品、护发产品及家居生活品等六大类。
2023-07-25 08:58:311

如何在JS中还原被转码的字符 amp;amp;nbsp;amp;amp;quot等等

首先你已经安装了交叉编译工具链,比如说自己安装了gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux工具然后cmake用的是cmake-3.4.1-Linux-i386.tar.gz版本,其实这个只需在linux中解压即可,需要用cmake-gui时,只需到bin目录下,sudo ./cmake-gui即可打开cmake-gui之后,选择要编译的源文件和编译之后存放的路径
2023-07-25 08:58:581

如何编译可以在Windows下运行的带有Python支持的ARM Linux GDB

做这件事情的目的是为了在QtCreator里调试ARM Linux程序的时候,能看清楚QString、QList这些Qt特有的对象的内容,而不是一个完全看不懂的结构体。目前(2014年8月)Linaro、CodeSourcery的GCC工具链里的GDB都不支持Python。想知道你用的GDB支持不支持,试一试就行,这样表示不支持:(gdb) python>print "Hello GDB!">(按Ctrl+D)Python scripting is not supported in this copy of GDB.这样表示支持:(gdb) python>print "Hello GDB!">(按Ctrl+D)Hello GDB!这件事情乍一看也很简单,只要把GDB源码下载下来,然后再配置,打开Python支持就行了。实际上会遇到的问题是,在MinGW下,又要与“”和“:”这两个Windows路径里的刺头斗争了。我觉得我之前挺傻,编译MinGW下Qt的时候,就去硬磕源码和configure脚本去了。这次GDB的configure是自动生成的,不是给人看的,configure.ac看起来也很费劲,根本磕不下去,于是我换了个思路,在ubuntu下交叉编译吧,sudo apt-get install mingw32,这是Ubuntu下的MinGW交叉编译器。然后是依赖,这样的GDB要依赖expat和python的开发版本。如果是ubuntu底下直接编译,apt-cache search一下他们的开发版本,然后sudo apt-get install一下就好了;给MinGW交叉编译就麻烦了。先说expat,这个好办,把http://downloads.sourceforge.net/project/expat/expat/2.1.0/expat-2.1.0.tar.gz下载下来,然后:./configure --prefix=[安装目录,如/home/cdu/mingw-gdb/expat] --host=i586-mingw32msvcmakemake install会提示一些警告,无视即可。Python就无语了,目前的GDB貌似最高支持Python 2.7,而2.7版本的Python本身不支持MinGW…… 好在有高手做了Patch,也写了说明,可以参考这文章:http://mdqinc.com/blog/2011/10/cross-compiling-python-for-windows-with-mingw32/但是,就算这样,编译也充满挑战,要修复很多问题,出来的Python还少“nt”模块。就在我觉得没办法的时候,突然发现Windows版Qt提供的MinGW居然内置了Python开发包,位置在Tools/mingw48_32/opt,赶紧把它拷贝到Linux下,比如/home/cdu/mingw-gdb/python。当然,你也必须确保ubuntu下有可用的python。然后,给GDB打一个补丁:--- gdb-7.8/gdb/configure 2014-07-29 20:37:42.000000000 +0800+++ gdb-7.8-old/gdb/configure 2014-08-30 00:08:27.122042706 +0800@@ -8263,21 +8263,22 @@ # We have a python program to use, but it may be too old. # Don"t flag an error for --with-python=auto (the default). have_python_config=yes- python_includes=`${python_prog} ${srcdir}/python/python-config.py --includes`+ python_config_tool=`echo ${python_prog} | sed "s#python.exe#python-config#g"`+ python_includes=`${python_config_tool} --includes` if test $? != 0; then have_python_config=failed if test "${with_python}" != auto; then as_fn_error "failure running python-config --includes" "$LINENO" 5 fi fi- python_libs=`${python_prog} ${srcdir}/python/python-config.py --ldflags`+ python_libs=`${python_config_tool} --ldflags` if test $? != 0; then have_python_config=failed if test "${with_python}" != auto; then as_fn_error "failure running python-config --ldflags" "$LINENO" 5 fi fi- python_prefix=`${python_prog} ${srcdir}/python/python-config.py --exec-prefix`+ python_prefix=`${python_config_tool} --exec-prefix` if test $? != 0; then have_python_config=failed if test "${with_python}" != auto; then@@ -8343,12 +8344,12 @@ return 0; } _ACEOF-if ac_fn_c_try_link "$LINENO"; then :+#if ac_fn_c_try_link "$LINENO"; then : have_libpython=${version} found_usable_python=yes PYTHON_CPPFLAGS=$new_CPPFLAGS PYTHON_LIBS=$new_LIBS-fi+#fi rm -f core conftest.err conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext CPPFLAGS=$save_CPPFLAGS这个补丁的目的是强制为检测到python。然后给拷贝到Linux下的python开发包打一个补丁:--- python-old/bin/python-config 2013-04-18 02:43:01.000000000 +0800+++ python/bin/python-config 2014-08-30 00:53:16.630060288 +0800@@ -1,4 +1,4 @@-#!/temp/x32-480-posix-dwarf-r2/mingw32/opt/bin/python2.7.exe+#!/usr/bin/python import sys import os@@ -31,26 +31,23 @@ for opt in opt_flags: if opt == "--prefix":- print sysconfig.PREFIX+ print "../python" elif opt == "--exec-prefix":- print sysconfig.EXEC_PREFIX+ print "../python" elif opt in ("--includes", "--cflags"):- flags = ["-I" + sysconfig.get_python_inc(),- "-I" + sysconfig.get_python_inc(plat_specific=True)]+ flags = ["-I" + os.path.split(os.path.realpath(__file__))[0] + "/../include/python2.7"] if opt == "--cflags":- flags.extend(getvar("CFLAGS").split())+ flags += ["-fno-strict-aliasing -DMS_WIN32 -DMS_WINDOWS -DHAVE_USABLE_WCHAR_T -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes"] print " ".join(flags) elif opt in ("--libs", "--ldflags"):- libs = getvar("LIBS").split() + getvar("SYSLIBS").split()- libs.append("-lpython"+pyver)+ libs = ["-lm -lpython2.7 -Wl,--out-implib=libpython2.7.dll.a"] # add the prefix/lib/pythonX.Y/config dir, but only if there is no # shared library in prefix/lib/. if opt == "--ldflags": if not getvar("Py_ENABLE_SHARED"):- libs.insert(0, "-L" + getvar("LIBPL"))- libs.extend(getvar("LINKFORSHARED").split())+ libs.insert(0, "-L" + os.path.split(os.path.realpath(__file__))[0] + "/../lib/python2.7/config") print " ".join(libs) 因为Linux下是无法运行开发包中的python.exe的,所以这个补丁借用了ubuntu的python。里面的cflags和ldflags都是在Windows底下运行原始python-config获得的。prefix和exec-prefix设成“../python”,可以在编译完以后,把python开发包拷贝到gdb安装目录里面的python子目录,这样运行GDB的时候就不需要设定PYTHONHOME环境变量了。最后一个事情,确保你的Linux下有arm交叉编译器,我的是arm-linux-gnueabihf,是啥target就写啥。准备工作做完了,开始配置和编译:./configure --with-expat --host=i586-mingw32msvc --target=arm-linux-gnueabihf --with-libexpat-prefix=[expat安装位置] --with-python=[python开发包安装位置/bin/python.exe]makemake DESTDIR=[GDB安装位置] install然后把GDB安装位置下面的所有文件拷贝到Windows下,再把python开发包拷贝到同目录下的python子目录,大功告成。如果提示没找到libpython2.7.dll,那就把GDB安装目录的python/bin下的拷贝到bin下。如果发现生成的exe文件太大了,那就strip一下。2015年9月12日追加:在windows下调试时,一般会提示说加载不了共享库,让你用"set sysroot"或"set solib-search-path"之类设定路径的。这个问题可以通过.gdbinit文件,用上面这两条命令来设定路径解决,如果想一劳永逸,可以在编译的时候加上host_configargs环境变量来解决这个问题:host_configargs=--with-sysroot=E:MinGWoptsysroot-arm ./configure ...或者export host_configargs=--with-sysroot=E:MinGWoptsysroot-arm./configure ...后面的路径是放在windows下的sysroot的位置。
2023-07-25 08:59:081

如何安装ARM toolchain

我们有两个选择,第一是直接在 Raspberry Pi 上编译。第二是先在我们的个人电脑用 Raspberry Pi 的 toolchain 编译完成後,再上传到 Pi。这里简介如何在个人电脑安装 Raspberry Pi 的 toolchain,以在 ubuntu 上安装 gcc-linaro-arm-linux-gnueabihf-raspbian 为例。1. 在个人电脑安装必要的套件。sosorry@ubuntu:~$ sudo apt-get install make git-core ncurses-dev2. 下载最新版的 toolchain。sosorry@ubuntu:~$ mkdir rpisosorry$ubuntu:~$ cd rpisosorry@ubuntu:~/rpi$ git clone https://github.com/raspberrypi/tools.gitremote: Reusing existing pack: 17273, done.remote: Total 17273 (delta 0), reused 0 (delta 0)Receiving objects: 100% (17273/17273), 311.52 MiB | 343 KiB/s, done.Resolving deltas: 100% (11698/11698), done.Checking out files: 100% (15860/15860), done.3. 安装 toolchain。安装方法是将 gcc-linaro-arm-linux-gnueabihf-raspbian 加到环境变数里。sosorry@ubuntu:~/rpi$ vi ~/.bashrcexport PATH=$PATH:/home/sosorry/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin # add this line at the end of file4. 测试。先开启一个新的终端机,输入 arm 後连续按两次 tab 键,如果跑出来一堆像下面的提示表示安装成功。arm-linux-gnueabihf-addr2line arm-linux-gnueabihf-gcc arm-linux-gnueabihf-gfortran arm-linux-gnueabihf-objdumparm-linux-gnueabihf-ar arm-linux-gnueabihf-gcc-4.7.2 arm-linux-gnueabihf-gprof arm-linux-gnueabihf-pkg-configarm-linux-gnueabihf-as arm-linux-gnueabihf-gcc-ar arm-linux-gnueabihf-ld arm-linux-gnueabihf-pkg-config-realarm-linux-gnueabihf-c++ arm-linux-gnueabihf-gcc-nm arm-linux-gnueabihf-ld.bfd arm-linux-gnueabihf-ranlibarm-linux-gnueabihf-c++filt arm-linux-gnueabihf-gcc-ranlib arm-linux-gnueabihf-ldd arm-linux-gnueabihf-readelfarm-linux-gnueabihf-cpp arm-linux-gnueabihf-gcov arm-linux-gnueabihf-ld.gold arm-linux-gnueabihf-sizearm-linux-gnueabihf-elfedit arm-linux-gnueabihf-gdb arm-linux-gnueabihf-nm arm-linux-gnueabihf-stringsarm-linux-gnueabihf-g++ arm-linux-gnueabihf-gdbtui arm-linux-gnueabihf-objcopy arm-linux-gnueabihf-strip
2023-07-25 08:59:151

美图m8s什么处理器

根据美图官方网站数据显示,美图m8s手机是用的联发科技公司生产曦力X20十核处理器,型号是联发科技MT6797X。扩展资料:产品简介联发科技曦力X20 (MT6797) 采用的是三丛集架构,每层架构均都是为了更有效率地处理不同工作负载种类。它将核心分成三个丛集,情况就像汽车增加车辆的排档,可更具效率地分配运算工作,务求为用户带来最佳效能表现和更持久的电池使用时间。在这个架构下,一些简单的运算工作会被指派去其中一个丛集,而较为复杂 (亦即较为耗能) 的工作就会被派到其他丛集。联发科技曦力X20(MT6797) 能要求最高的应用程序带来顶级的镜头、画质、游戏及音频等功能效果,产品不但推出了双主镜头功能,它还内置了 3D 深度引擎和多模式降噪引擎,缩短拍摄反应时间,即使在恶劣的拍摄环境下,也能带来前所未见的画面细节、色彩及锐利度。拍摄画面会以更快的 120 fps 速度保持更新,让浏览网页和地图时的反应度既利落又灵敏,也让手机游戏的图像以高分辨率的状态呈现,观感无可比拟。产品内置的 ARM Cortex-M4 处理器上的感应枢纽会在独立的低功耗区域中运作,以支持各式各样的常驻应用程序。联发科技曦力 X20 开发板介绍联发科技曦力X20(MT6797)开发板是基于Linaro 96Boards开放开发板规格而设计,它是目前市场上唯一采用三丛十核架构和ARM Cortex-A72内核的硬件开发平台。产品以其优异的高性能和低功耗优势,为开发者们提供更多的自由空间来开发更复杂的应用和实现更多的功能,比如POS移动支付终端、VR、高级驾驶辅助系统(ADAS)、智能标(Signage)、自动售货机等等。参考来源:美图官网-M8s手机参考来源:联发科技公司官网-曦力X20 (MT6797)
2023-07-25 08:59:254

编译openwrt程序报错

主要原因可能上是因为内存不足, 临时使用交换分区来解决 sudo dd if=/dev/zero of=/swapfile bs=64M count=16 sudo mkswap /swapfile sudo swapon /swapfile 编译结束后关闭并删除 sudo swapoff /swapfile sudo rm /swapfile
2023-07-25 08:59:591

蓝宝石的主要产区在哪?哪里的宝石质地最好?

蓝宝石在名人效应的影响下,其知名度和市场接受度可以说在众多彩色宝石中名列前茅,深受各界人士的喜欢,有不少人都很好奇,蓝宝石这样颜色丰富美丽多变的宝石都产自哪里?哪些产地的蓝宝石最好?蓝宝石的产地有很多,克什米尔、缅甸、马达加斯加、斯里兰卡、美国蒙大拿、中国山东等等都有蓝宝石的产出。其中克什米尔是最著名的蓝宝石产地,缅甸、马达加斯加、斯里兰卡是市场上比较主要的蓝宝石产地,要从品质上说哪个产地的蓝宝石最好还真的是很难说,毕竟每个产地都有高品质的蓝宝石产出,且产地也不能保证蓝宝石的品质。但是市场上确实存在产地不一样价格也不一样的现象,这是因为不同产地的蓝宝石市场知名度、认可度以及稀有性不一样所造成的。从蓝宝石的市场知名度、认可度以及稀有性来看,克什米尔、缅甸、斯里兰卡、马达加斯加是比较好的蓝宝石产地。克什米尔已经是蓝宝石市场上的一则传奇了,该产地的高品质蓝宝石拥有天鹅绒般的质感,非常美丽,但是从发现到开采中间仅10年,在1889年就宣布绝矿了,市场上是可遇不可求。缅甸也是非常著名的蓝宝石产地,该产地产出的高品质皇家蓝蓝宝石子在市场上的表现非常亮眼,可以说仅次于克什米尔蓝宝石。斯里兰卡也是非常重要的蓝宝石产地,该产地的彩色蓝宝石最为出名,其中帕帕拉恰蓝宝石更是俘获了不少消费者的心。马达加斯加则是近几年崛起的蓝宝石产地,该产地的蓝宝石很大的一个特点就是在外观上和克什米尔蓝宝石十分相似。这几个产地都是市场知名度、认可度以及稀有性非常高的蓝宝石产地,也是众多珠宝投资收藏爱好者的首选。
2023-07-25 09:00:103

openwrt-SDK编译成功但找不到ipk

解压之后就是OpenWrt-SDK-ar71xx-for-linux-i686-gcc-4.6-linaro_uClibc-0.9.33.2,此目录结构跟openwrt的目录结构基本一致[cpp] view plain copysong@song-virtual-machine:attitude_adjustment# ls bin/ar71xx/OpenWrt-SDK-ar71xx-for-linux-i686-gcc-4.6-linaro_uClibc-0.9.33.2 bin Config.in docs include logs package Packages.gz rules.mk staging_dir tmp build_dir dl feeds.conf.default LICENSE Makefile Packages README.SDK scripts target [cpp] view plain copysong@song-virtual-machine:attitude_adjustment# ls bin build_dir dl feeds.conf.default LICENSE Makefile README scripts target toolchain BSDmakefile Config.in docs feeds include
2023-07-25 09:05:151

android怎么修改源码

在Android界面的系统status bar上添加home,back,menu三个菜单,并完成对应的系统功能。并有higlight效果,修改status bar 高度和status bar上的文字尺寸。这需要修改android sdk才能完成,我用的是eclair.下面就我的操作进行叙述。1.首先完成界面显示效果。需要修改文件./frameworks/base/services/java/com/android/server/status/StatusBarPolicy.java,仿照mBatteryIcon等icon的添加方式添加自定义的icon,图片名称指定就好了。另外还要记得修改./frameworks/base/core/res/res/values/arrays.xml,这里定义了icon的slot,并且决定了icon的摆放顺序。这样,你需要的icon按键就可以显示在系统的status bar上面了。2.判断touch event是否按动了某个icon需要修改的文件./frameworks/base/services/java/com/android/server/status/StatusBarView.java首先在onTouchEvent函数中,获取当前event的坐标,然后比较是否在某个按键范围之内。由于系统对于statusBar的范围已经有了定义,所以这里只需要比较横坐标就可以了。其次,也是这一步最关键的,怎么获取具体某一个icon的左右边界坐标呢?系统的status bar左边显示的图标都是notification, 右边显示的是系统icon. 也就是说左边icon属于mNotificationIcons,右边的icon属于mStatusIcons. 在文件StatusBarView.java中出现的offset = getViewOffset(mStatusIcons),得到mStatusIcons的最左边的icon的left横坐标。用N = mStatusIcons.getChildCount()得到共有几个系统icon,其中包含visibility为false的icons.用mStatusIcons.getChildAt(N-i)得到的是从右边数第i个的icon view. 这个view的getLeft()+offset就是这第i个icon的左边横坐标,对应的getRight()+offset就是这第i个icon的右边横坐标。本例中home键是右边第2个icon.3.定义icon响应事件这里使用的方法是在StatusBarView.java中向./frameworks/base/services/java/com/android/server/status/StatusBarPolicy.java发送一个Broadcast,让StatusBarPolicy来完成具体的事件操作。这里需要注意的是不仅要在./frameworks/base/core/java/android/content/Intent.java中定义intent,还要在StatusBarPolicy的构造函数中添加该intent的过滤动作,即filter.addAction(Intent.ACTION_BACKICON_CHANGED).例如,按动了back键,如果当前事件为action_up,就向系统发送一个keyEvent,keyCode为KeyEvent.KEYCODE_BACK. 这里借用的是./frameworks/base/cmds/input/src/com/android/commands/input/Input.java中的sendKeyEvent函数,直接拷贝过来,按照需要稍微修改一下形参就可以了,过程不要修改。需要说明的是,当点击statusBar可以拉出来一个notification列表,当这个列表显示出来的时候,这三个back, menu, home键的响应速度会非常慢,所以这时不响应事件并隐藏这三个键。具体做法是在StatusBarView的onTouchEvent()中判断mService.mExpanded或者 mService.mTracking为真时就不做响应。mService是StatusBarService对象。隐藏三个键也是用Broadcast来做的,但这个intent是由StatusBarServie发出来的,当mExpandedVisible = false时显示,当mExpandedVisible = true时隐藏。这里还同时完成了highlight换图的动作,也是用Broadcast来做得,处理过程一样,就是需要区分action_down和action_up就可以了。4.调整status bar的高度如果你需要显示较大的屏幕尺寸,同时statusBar的高度要拉大,上面的icon的size也需要调大。为了协调一致,显示时间的字体和notification显示的日期的字体也需要调大。具体做法如下:a.调节status bar icon的size: 只调节status_bar.xml的textSize标签似乎不起作用,同时又修改了./base/services/java/com/android/server/status/StatusBarIcon.java的t.setTextSize(32);语句才成功。不知道修改status_bar.xml的<com.android.server.status.AnimatedImageView>标签下的layout_height值是不是必须的,反正我是一起都给改了。b.调节status bar height: ./base/core/res/res/values/dimens.xml 找得我好辛苦!不知道还需不需要修改./base/core/res/res/values/themes.xml中的Window attributes的windowTitleSize值,反正我也给改了。c.调节notification显示日期字体的大小,修改status_bar.xml的<com.android.server.status.DateView>的textSize值。到这里,就完成了所有工作,看看效果吧。
2023-07-25 09:05:252

如何编译一个linux下的驱动模块

linux下编译运行驱动嵌入式linux下设备驱动的运行和linux x86 pc下运行设备驱动是类似的,由于手头没有嵌入式linux设备,先在vmware上的linux上学习驱动开发。按照如下方法就可以成功编译出hello world模块驱动。1、首先确定本机linux版本怎么查看Linux的内核kernel版本?"uname"是Linux/unix系统中用来查看系统信息的命令,适用于所有Linux发行版。配合使用"uname"参数可以查看当前服务器内核运行的各个状态。#uname -aLinux whh 3.5.0-19-generic #30-Ubuntu SMPTue Nov 13 17:49:53 UTC 2012 i686 i686 i686 GNU/Linux 只打印内核版本,以及主要和次要版本:#uname -r3.5.0-19-generic 要打印系统的体系架构类型,即的机器是32位还是64位,使用:#uname -pi686 /proc/version 文件也包含系统内核信息:# cat /proc/versionLinux version 3.5.0-19-generic(buildd@aatxe) (gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) ) #30-UbuntuSMP Tue Nov 13 17:49:53 UTC 2012 发现自己的机器linux版本是:3.5.0-19-generic2、下载机器内核对应linux源码到下面网站可以下载各个版本linux源码https://www.kernel.org/如我的机器3.5.0版本源码下载地址为:https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.5.tar.bz2下载完后,找一个路径解压,如我解压到/linux-3.5/然后很重要的一步是:执行命令uname -r,可以看到Ubuntu的版本信息是3.5.0-19-generic。进入linux源码目录,编辑Makefile,将EXTRAVERSION = 修改为EXTRAVERSION= -19-generic。这些都是要配置源码的版本号与系统版本号,如果源码版本号和系统版本号不一致,在加载模块的时候会出现如下错误:insmod: error inserting "hello.ko": -1 Invalid module format。原因很明确:编译时用的hello.ko的kenerl 不是我的pc的kenerl版本。 执行命令cp /boot/config-3.5.0-19-generic ./config,覆盖原有配置文件。进入linux源码目录,执行make menuconfig配置内核,执行make编译内核。3、写一个最简单的linux驱动代码hello.c /*====================================================================== Asimple kernel module: "hello world"======================================================================*/#include <linux/init.h>#include <linux/module.h>MODULE_LICENSE("zeroboundaryBSD/GPL");static int hello_init(void){ printk(KERN_INFO"Hello World enter "); return0;} static void hello_exit(void){ printk(KERN_INFO"Hello World exit ");} module_init(hello_init);module_exit(hello_exit); MODULE_AUTHOR("zeroboundary");MODULE_DESCRIPTION("A simple HelloWorld Module");MODULE_ALIAS("a simplestmodule"); 4、写一个Makefile对源码进行编译KERN_DIR = /linux-3.5all: make-C $(KERN_DIR) M=`pwd` modulesclean: make-C $(KERN_DIR) M=`pwd` clean obj-m += hello.o 5、模块加载卸载测试insmod hello.kormmod hello.ko 然后dmesg|tail就可以看见结果了最后,再次编译驱动程序hello.c得到hello.ko。执行insmod ./hello.ko,即可正确insert模块。 使用insmod hello.ko 将该Module加入内核中。在这里需要注意的是要用 su 命令切换到root用户,否则会显示如下的错误:insmod: error inserting "hello.ko": -1 Operation not permitted 内核模块版本信息的命令为modinfo hello.ko通过lsmod命令可以查看驱动是否成功加载到内核中通过insmod命令加载刚编译成功的time.ko模块后,似乎系统没有反应,也没看到打印信息。而事实上,内核模块的打印信息一般不会打印在终端上。驱动的打印都在内核日志中,我们可以使用dmesg命令查看内核日志信息。dmesg|tail可能还会遇到这种问题insmod: error inserting "hello.ko": -1 Invalid module format用dmesg|tail查看内核日志详细错误disagrees about version of symbolmodule_layout,详细看这里。http://www.ibm.com/developerworks/cn/linux/l-cn-kernelmodules/index.html在X86上我的办法是:make -C/usr/src/linux-headers-3.5.0-19-generic SUBDIRS=$PWD modules
2023-07-25 09:05:332

LinaRomay出生于哪里

LinaRomayLinaRomay是一位演员、副导演、编剧、剪辑师、制作人,主要作品有《VideoNasties:MoralPanic,Censorship&Videotape》《城堡梦魇对吸血鬼》等。外文名:LinaRomay合作人物:杰克·维斯特职业:演员、副导演、编剧、剪辑师、制作人代表作品:《VideoNasties:MoralPanic,Censorship&Videotape》
2023-07-25 09:05:591

JDK在ARM嵌入式系统中性能差异为什么这么大

如果题主用的平台是ARMv7,那么Oracle JDK有Java SE版,也有Java SE Embedded版可以在上面运行。这两者中的JVM都是HotSpot VM,里面都是标准配备。而目前在已经整合进主干的代码里,OpenJDK只有Zero VM可以在ARMv7上运行,这不是标准的HotSpot VM,而是一个实现得比较粗糙的、为了简易跨平台而牺牲了性能的实现。拿这个跟标配HotSpot VM比当然比不过。如果是说AArch64,则Oracle JDK有一套私有实现,OpenJDK里有一套Red Hat/Linaro贡献的开源实现,两者不是同一个东西。虽然都是标配HotSpot VM,但Oracle版还是更优化一些,开源版仍需努力…ARMv7上还有若干其它情况。一种是Red Hat的另一个OpenJDK port,叫做microJIT,专攻资源非常受限的场景——实现较简单,性能不如标配HotSpot VM;另一种是最近正在如火如荼的开发中的、跟Java SE Embedded版同级别的标配HotSpot VM的开源port,Linaro抢先发布消息,而鄙司(Azul Systems)也在大力投入开发资源,产品名为Zulu Embedded。这个到明年中会有更多消息。
2023-07-25 09:06:071

OpenJDK和Oracle JDK在ARM嵌入式系统中性能差异为什么这么大

OpenJDK和Oracle JDK在ARM嵌入式系统中性能差异为什么这么大如果题主用的平台是ARMv7,那么Oracle JDK有Java SE版,也有Java SE Embedded版可以在上面运行。这两者中的JVM都是HotSpot VM,里面都是标准配备。而目前在已经整合进主干的代码里,OpenJDK只有Zero VM可以在ARMv7上运行,这不是标准的HotSpot VM,而是一个实现得比较粗糙的、为了简易跨平台而牺牲了性能的实现。拿这个跟标配HotSpot VM比当然比不过。如果是说AArch64,则Oracle JDK有一套私有实现,OpenJDK里有一套Red Hat/Linaro贡献的开源实现,两者不是同一个东西。虽然都是标配HotSpot VM,但Oracle版还是更优化一些,开源版仍需努力…ARMv7上还有若干其它情况。一种是Red Hat的另一个OpenJDK port,叫做microJIT,专攻资源非常受限的场景——实现较简单,性能不如标配HotSpot VM;另一种是最近正在如火如荼的开发中的、跟Java SE Embedded版同级别的标配HotSpot VM的开源port,Linaro抢先发布消息,而鄙司(Azul Systems)也在大力投入开发资源,产品名为Zulu Embedded。这个到明年中会有更多消息。
2023-07-25 09:06:151

版本信息

root@wthink-os:~# uname -a Linux wthink-os 4.4.58-20170818.kylin.5.server.YUN+-generic #5 SMP Fri Aug 18 17:43:42 CST 2017 aarch64 aarch64 aarch64 GNU/Linux root@wthink-os:~# cat /proc/version Linux version 4.4.58-20170818.kylin.5.server.YUN+-generic (jackieliu@Kylin) (gcc version 5.3.1 20160413 (Ubuntu/Linaro 5.3.1-14kord4) ) #5 SMP Fri Aug 18 17:43:42 CST 2017 root@wthink-os:~# lsb_release -a No LSB modules are available. Distributor ID: Kylin Description: Kylin 4.0.2 Release: 4.0.2 Codename: juniperKylin 4.0.2 l
2023-07-25 09:06:221

如何在Windows下构建ARM Linux QT开发环境

准备工作:首先,最不可思议的,是要在Linux下把QT编译一遍,因为库都是一样的,需要的就是一些Windows下的qmake、moc、uic之类的工具而已。因为QT源码很多地方不能在Windows下面交叉编译通过,虽然我改了一些代码和配置(一会儿我贴出补丁来),但我只用它编译了qtbase、qtdeclarative这两个模块和qttools模块中的一部分。Linux下的编译可以参照我之前写的这篇文章。参考配置:开发包:./configure -extprefix /opt/qt/5.2.1/arm -prefix /usr -plugindir /usr/lib/qt/plugins -importdir /usr/lib/qt/imports -qmldir /usr/lib/qt/qml -make libs -xplatform linux-arm-gnueabi-g++ -opengl es2 -confirm-license -opensource -xcb -xinput2 -nomake examples -nomake tests -qt-zlib -qt-xcb -dbus -largefile -cups -no-fontconfig -glib -gtkstyle -qt-freetype -sysroot /opt/sysroot-arm -mysql_config /opt/sysroot-arm/usr/bin/mysql_config -v运行库:./configure -prefix /usr -plugindir /usr/lib/qt/plugins -importdir /usr/lib/qt/imports -qmldir /usr/lib/qt/qml -make libs -xplatform linux-arm-gnueabi-g++ -opengl es2 -confirm-license -opensource -xcb -xinput2 -nomake examples -nomake tests -qt-zlib -qt-xcb -dbus -largefile -cups -no-fontconfig -glib -gtkstyle -qt-freetype -sysroot /opt/sysroot-arm -mysql_config /opt/sysroot-arm/usr/bin/mysql_config -v做完这一步,你获得两样东西,sysroot和linux下的ARM QT开发文件。sysroot是编译QT之前,用Buildroot做的开发用根目录。这两个东西都要拷贝到Windows里,因为Windows不支持符号连接,拷贝需要需要去掉这些连接,这么做:cp [源目录] [目标目录] -Lr第二,需要一个Windows下模拟Linux环境的东西和编译器,我用的是MSYS和MinGW,因为他们编译出来的程序比Cygwin快。在这里可以找到:http://www.mingw.org/。第三,需要Linaro ARM GCC编译器,Windows版本的。在这里可以找到:http://www.linaro.org/downloads/第四,需要Python,Windows版本的。在这里可以找到:https://www.python.org/downloads/下载、安装,然后在MSYS根目录的/etc/profile里面export PATH=$PATH:[Python安装目录]第五,需要pkg-config,Windows版本的,这个比较麻烦,需要下载以下三个文件,并提取出我们需要的东西:http://ftp.acc.umu.se/pub/gnome/binaries/win32/dependencies/pkg-config_0.26-1_win32.zip(提取pkg-config.exe)http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.28/glib_2.28.8-1_win32.zip(提取libglib-2.0-0.dll)http://ftp.acc.umu.se/pub/gnome/binaries/win32/dependencies/gettext-runtime_0.18.1.1-2_win32.zip (提取intl.dll)把他们都放到MSYS的bin目录下,然后给pkg-config.exe做一个脚本pkg-config,因为下载的pkg-config.exe比较蠢,在同时指定PKG_CONFIG_SYSROOT_DIR和PKG_CONFIG_LIBDIR这两个环境变量的时候,第一个cflags会输出两次PKG_CONFIG_SYSROOT_DIR。这么做这个脚本:#!/bin/shpushd / > /dev/nullROOTDIR=`pwd -W 2>/dev/null`popd > /dev/nullSYSROOT=$PKG_CONFIG_SYSROOT_DIRpkg-config.exe "$@" | sed "s#$SYSROOT$SYSROOT#$SYSROOT#g" | sed "s#$ROOTDIR##g"最后去掉$ROOTDIR前缀是为了和Linux Makefile兼容,同时也不会影响在make中的地址转换,最后,QT源码和我的补丁。我的补丁如下:diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/configure qt-everywhere-opensource-src-5.2.1/qtbase/configure--- qt-everywhere-opensource-src-5.2.1-old/qtbase/configure 2014-02-02 04:37:23 +0800+++ qt-everywhere-opensource-src-5.2.1/qtbase/configure 2014-08-27 22:34:47 +0800@@ -4022,6 +4022,10 @@ done (cd "$outpath/qmake"; "$MAKE") || exit 2+ if [ -e "$outpath/bin/qmake.exe" ]; then+ echo "#!/bin/sh" > "$outpath/bin/qmake"+ echo "$outpath/bin/qmake.exe" ""$@"" "-unix" >> "$outpath/bin/qmake"+ fi fi # Build qmake echo "Running configuration tests..."@@ -4091,9 +4095,9 @@ # when xcompiling, check environment to see if it"s actually usable if [ -z "$PKG_CONFIG_LIBDIR" ]; then if [ -n "$CFG_SYSROOT" ] && [ -d "$CFG_SYSROOT/usr/lib/pkgconfig" ]; then- PKG_CONFIG_LIBDIR=$CFG_SYSROOT/usr/lib/pkgconfig:$CFG_SYSROOT/usr/share/pkgconfig+ PKG_CONFIG_LIBDIR=$CFG_SYSROOT/usr/lib/pkgconfig;$CFG_SYSROOT/usr/share/pkgconfig if [ -n "$GCC_MACHINE_DUMP" ]; then- PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:$CFG_SYSROOT/usr/lib/$GCC_MACHINE_DUMP/pkgconfig+ PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR;$CFG_SYSROOT/usr/lib/$GCC_MACHINE_DUMP/pkgconfig fi export PKG_CONFIG_LIBDIR echo >&2 "Note: PKG_CONFIG_LIBDIR automatically set to $PKG_CONFIG_LIBDIR"diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf--- qt-everywhere-opensource-src-5.2.1-old/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 2014-02-02 04:37:37 +0800+++ qt-everywhere-opensource-src-5.2.1/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 2014-08-28 00:08:34 +0800@@ -11,14 +11,21 @@ include(../common/g++-unix.conf) # modifications to g++.conf-QMAKE_CC = arm-linux-gnueabi-gcc-QMAKE_CXX = arm-linux-gnueabi-g++-QMAKE_LINK = arm-linux-gnueabi-g++-QMAKE_LINK_SHLIB = arm-linux-gnueabi-g+++QMAKE_CC = arm-linux-gnueabihf-gcc+QMAKE_CXX = arm-linux-gnueabihf-g+++QMAKE_LINK = arm-linux-gnueabihf-g+++QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++ # modifications to linux.conf-QMAKE_AR = arm-linux-gnueabi-ar cqs-QMAKE_OBJCOPY = arm-linux-gnueabi-objcopy-QMAKE_NM = arm-linux-gnueabi-nm -P-QMAKE_STRIP = arm-linux-gnueabi-strip+QMAKE_AR = arm-linux-gnueabihf-ar cqs+QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy+QMAKE_NM = arm-linux-gnueabihf-nm -P+QMAKE_STRIP = arm-linux-gnueabihf-strip++# support for OpenGL+QMAKE_LIBS_EGL = -lEGL+QMAKE_LIBS_OPENGL_ES1 = -lGLES_CM+QMAKE_LIBS_OPENGL_ES2 = -lGLESv2+#QMAKE_LIBS += + load(qt_config)diff -Naur qt-everywhere-opensource-src-5.2.1-old/qtbase/qmake/generators/makefile.cpp qt-everywhere-opensource-src-5.2.1/qtbase/qmake/generators/makefile.cpp--- qt-everywhere-opensource-src-5.2.1-old/qtbase/qmake/generators/makefile.cpp 2014-02-02 04:37:29 +0800+++ qt-everywhere-opensource-src-5.2.1/qtbase/qmake/generators/makefile.cpp 2014-08-26 13:53:15 +0800@@ -1161,8 +1161,8 @@ QString srcf = (*sit).toQString(); QString dstf = (*oit).toQString();- t << escapeDependencyPath(dstf) << ": " << escapeDependencyPath(srcf)- << " " << escapeDependencyPaths(findDependencies(srcf)).join(" \ ");+ t << escapeDependencyPath(dstf).replace(QRegExp("\\"), "/") << ": " << escapeDependencyPath(srcf).replace(QRegExp("\\"), "/")+ << " " << escapeDependencyPaths(findDependencies(srcf)).replaceInStrings(QRegExp("\\"), "/").join(" \ "); ProKey comp, cimp; for(QStringList::Iterator cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) {@@ -3346,6 +3346,8 @@ QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QString &src, const QString &dst) { QString ret;+ QString src_p = src;+ QString dst_p = dst; if (project->isEmpty(replace_rule) || project->isActiveConfig("no_sed_meta_install")) { ret += "-$(INSTALL_FILE) "" + src + "" "" + dst + """;@@ -3362,7 +3364,7 @@ + "," + windowsifyPath(replace.toQString()) + ",gi"); } }- ret += " "" + src + "" >"" + dst + """;+ ret += " "" + src_p.replace(QRegExp("\\"), "/") + "" >"" + dst_p.replace(QRegExp("\\"), "/") + """; } return ret; } struct TermChain { TermChain(PatternTerm term)diff -Naur qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lrelease/lrelease.pro qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lrelease/lrelease.pro--- qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lrelease/lrelease.pro 2014-02-02 04:37:57 +0800+++ qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lrelease/lrelease.pro 2014-08-28 10:42:55 +0800@@ -1,4 +1,7 @@ option(host_build)++win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x+ QT = core-private DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII diff -Naur qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lupdate/lupdate.pro qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lupdate/lupdate.pro--- qt-everywhere-opensource-src-5.2.1-old/qttools/src/linguist/lupdate/lupdate.pro 2014-02-02 04:37:57 +0800+++ qt-everywhere-opensource-src-5.2.1/qttools/src/linguist/lupdate/lupdate.pro 2014-08-28 10:46:59 +0800@@ -1,4 +1,7 @@ option(host_build)++win32-g++*:QMAKE_CXXFLAGS_CXX11 = -std=gnu++0x+ QT = core-private qtHaveModule(qmldevtools-private) {接下来开始配置:其中-extprefix定义安装位置,在编译完以后可以改,一会儿说;-prefix、-plugindir、-importdir、-qmldir定义的位置是目标板上的位置,加双斜杠是为了防止MSYS翻译这些路径成MSYS的路径,其他的设定与Linux下的编译没有不同。Linux下编译的sysroot可以拷贝到例如:E:/MinGW/opt/sysroot-arm。然后编译make module-qtbasemake module-qtdeclarativecd qttools/src/linguist../../../qtbase/bin/qmake.exe -unix linguist.promake编译的时候可能会有几个库有链接错误,找不到一大堆gl、egl打头的函数,这是因为相应的Makefile里面的LIBS没有自动加上-lEGL -lGLES_CM -lGLESv2;但是正式使用qmake的时候不会,很奇怪;因为也就几个地方,出问题了手工加一下吧,我没去查原因改代码。编译linguist的时候可能会遇到这个问题:http://qt-project.org/forums/viewthread/33370,按里面说的处理。编译完了以后,把下列文件拷贝到Linux下编译的ARM QT开发包的bin目录中去:然后,删掉对应的ARM QT开发包的bin目录中没有exe后缀的文件,那些是Linux下的。最后一步,确保安装路径正确,也就是说,如果配置Windows下QT的时候设定-extprefix E:/MinGW/opt/qt/5.2.1/arm,那就要把替换过exe文件的ARM QT开发包放到这个位置,如果路径改了,可以用二进制搜索工具去qmake.exe中替换这个字串。补充一下关于调试的问题,其实不是很关键。在使用Debug模式编译的时候,最后会出现如下提示:warning: A handler for the OS ABI "GNU/Linux" is not built into this configurationof GDB. Attempting to continue with the default i386 settings.这是因为在mkspecs/features/unix/gdb_dwarf_index.prf中,有这样一段:QMAKE_GDB_INDEX += test $$(gdb --version | sed -e "s,[^0-9][^0-9]*\([0-9]\)\.\([0-9]\).*,\1\2,;q") -gt 72 && gdb --nx --batch --quiet -ex "set confirm off" -ex "save gdb-index $$QMAKE_GDB_DIR" -ex quit "$(TARGET)" && test -f $(TARGET).gdb-index && $$QMAKE_OBJCOPY --add-section ".gdb_index=$(TARGET).gdb-index" --set-section-flags ".gdb_index=readonly" "$(TARGET)" "$(TARGET)" && $$QMAKE_DEL_FILE $(TARGET).gdb-index || true很显然,这段代码把调试用的GDB默认为“gdb”了,所以应该改成你用的gdb,比如arm-linux-gnueabihf-gdb。另外,这里的sed对GDB版本的判断,无法识别像“GNU gdb (Sourcery CodeBench Lite 2014.05-29) 7.7.50.20140217-cvs”这样的版本信息的,只能识别像“GNU gdb (GDB) 7.6.1”这样的版本信息,所以你有可能看不到刚才那段提示。想解决,要么重新写一段sed的正则表达式,要么直接就把这个test ... -gt 72删掉。
2023-07-25 09:06:572

请哪位高人帮我把这段C语言代码转换成MIPS汇编语言

1 .file "6.c"2 .section .rodata3 .LC0:4 .string "350257267350276223345205245344270200344270252345255227347254246344270262:"5 .align 86 .LC1:8 .text9 .globl main10 .type main, @function11 main:12 .LFB0:13 .cfi_startproc14 pushq %rbp15 .cfi_def_cfa_offset 1616 .cfi_offset 6, -1617 movq %rsp, %rbp18 .cfi_def_cfa_register 619 addq $-128, %rsp20 movq %fs:40, %rax21 movq %rax, -8(%rbp)22 xorl %eax, %eax23 leaq -112(%rbp), %rdx24 movl $0, %eax25 movl $12, %ecx26 movq %rdx, %rdi27 rep stosq28 movq %rdi, %rdx29 movl %eax, (%rdx)30 addq $4, %rdx31 movl $0, -116(%rbp)32 movl $.LC0, %edi33 call puts34 leaq -112(%rbp), %rax35 movq %rax, %rdi36 call gets37 movl $0, -120(%rbp)38 jmp .L239 .L5:40 movl -120(%rbp), %eax41 cltq42 movzbl -112(%rbp,%rax), %eax43 cmpb $96, %al44 jle .L345 movl -120(%rbp), %eax46 cltq47 movzbl -112(%rbp,%rax), %eax48 cmpb $122, %al49 jle .L450 .L3:51 movl -120(%rbp), %eax52 cltq53 movzbl -112(%rbp,%rax), %edx54 movl -116(%rbp), %eax55 cltq56 movb %dl, -112(%rbp,%rax)57 addl $1, -116(%rbp)58 .L4:59 addl $1, -120(%rbp)60 .L2:61 movl -120(%rbp), %eax62 cltq63 movzbl -112(%rbp,%rax), %eax64 testb %al, %al65 jne .L566 movl -116(%rbp), %eax67 cltq68 movb $0, -112(%rbp,%rax)69 movl $.LC1, %edi70 call puts71 leaq -112(%rbp), %rax72 movq %rax, %rdi73 call puts74 movq -8(%rbp), %rdx75 xorq %fs:40, %rdx76 je .L677 call __stack_chk_fail78 .L6:79 leave80 .cfi_def_cfa 7, 881 ret82 .cfi_endproc83 .LFE0:84 .size main, .-main85 .ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"86 .section .note.GNU-stack,"",@progbits
2023-07-25 09:07:061

华为在上海的部门到底是做什么的。。我马上要去实习,想先了解下都需要准备些什么。

你是说华为的上海研究所吧。华为在上海主要做无线,其他部门也有,包括终端通信。另外一些其他部门也有,华为部门太多,具体的就不是特别清楚了。华为招聘的很多员工都是不限专业的,它招聘主要看学校。这个安排都是定好的,一般不会改变的。没事的,有这个实习的机会不错,你要珍惜。不用担心,华为有导师制,每个人都会安排一个导师带你的,很多人都是专业不对,但是也都很快顺利适应新工作了。只要你认真努力,可以学到很多技术和东西。华为的同事都很好相处,同事之间也很有爱,技术牛人也很多,真的不错。我看了一下上研所的华为招聘实习生的公告,你应该是会从事其中的一项吧。祝你好运了!(一)软件研发工程师职位说明:1、负责通信系统软件模块的设计、编码、调试、测试等工作;2、参与相关质量活动,确保设计、实现、测试工作按时保质完成。职位要求:1、计算机、通信、软件工程、自动化、数学、物理、力学、建筑或相关专业;2、熟悉C/C++语言/JAVA/底层驱动软件编程,熟悉TCP/IP协议、Intenet网络的基本知识;3、对通信知识有一定基础;4、能够熟练阅读和理解英文资料。 (二)互连工程师职位说明:1、负责产品的PCB板CAD设计,系统级和单板级信号质量仿真分析和设计;2、参与板级EMC设计、射频设计;执行热设计、可制造性、安规的设计要求。职位要求:1、电子、通信、自动化、数学相关专业;2、具有良好的模拟电路、数字电路基础;3、了解电磁场与微波、信号处理的基础知识;4、能够熟练阅读和理解英文资料。(三)工程工艺工程师职位说明:从事通讯类产品结构设计、工业设计、热设计及相关技术研究工作。职位要求:1、机械电子、材料加工、机械工程、工业设计、热能工程、动力工程、流体力学、低温与制冷等相关专业。2、熟练掌握以下任何一种工具软件者优先Pro/E, AutoCAD,Flotherm,ICEPAK,Coredraw,Rhino,3DMAX,Studio tools(四)芯片设计工程师职位说明:1、按照模块规格和芯片总体方案的要求,严格遵循开发流程、模板、标准和规范,承担模块的详细设计和实施工作,确保开发工作按时按质完成;2、及时编写各种设计文档和标准化资料,实现资源、经验共享。职位要求:1、微电子、计算机、通信工程、物理等相关专业;2、了解或实际应用过VHDL/Verilog语言编程,或具有FPGA设计经验,或熟悉综合(SYN)/时序分析(STA)/布局布线(Place and routing)/可测性设计(DFT),有相关工具应用的经验;或具有模拟IC设计项目经验。
2023-07-25 09:07:174

如何使用QEMU来模拟ARMv8开发平台

  使用Qemu模拟Cortex-A9运行U-boot和Linux 作者来源于网络  我的开发环境: Ubuntu-12.04 所有软件包为最新  1. 安装GNU工具链  sudo apt-get insatll gcc-arm-linux-gnueabi  sudo apt-get insatll g++-arm-linux-gnueabi  安装完成后会在 /usr/arm-linux-gnueabi/ 目录下生成库文件、头文件等。 我安装的GCC版本为:  arm-linux-gnueabi-gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3  Copyright (C) 2011 Free Software Foundation, Inc.  2. 安装Qemu模拟器  sudo apt-get install qemu qemu-system qemu-utils  这时应该已经可以运行qemu-system-arm命令了, 其版本为:  qemu-system-arm --version  QEMU emulator version 1.0.50 (Debian 1.0.50-2012.03-0ubuntu2), Copyright (c) 2003-2008 Fabrice Bellard  3. 编译和运行U-boot:  到 ftp://ftp.denx.de/pub/u-boot/ 下载最新版本的U-Boot源代码, 我用的目前最新版本 u-boot-2012.04.tar.bz2  解压后进入源代码目录,在Makefile里面增加两行:
2023-07-25 09:08:061

求助:mplayer交叉编译时遇到的错误

交叉编译mplayer的时候出现这样的错误arm1176jzf-s+vfp_gcc-4.8-linaro_uClibc-0.9.33.2_eabi/include/stdio.h:36,from mplayer.c:5:./libavutil/bswap.h:42:34: error: expected identifier or "(" before "__extension__"static av_always_inline uint16_t bswap_16(uint16_t x)^./libavutil/bswap.h:57:34: error: expected identifier or "(" before "__extension__"static av_always_inline uint32_t bswap_32(uint32_t x)^./libavutil/bswap.h:99:24: error: expected identifier or "(" before "__extension__"static inline uint64_t bswap_64(uint64_t x)^mplayer.c: In function "main": 错误处代码 static av_always_inline uint16_t bswap_16(uint16_t x)//static inline uint16_t bswap_16(uint16_t x){#if defined(ARCH_X86)__asm("rorw $8, %0" :LEGACY_REGS (x) :"0" (x));#elif defined(ARCH_SH4)__asm__("swap.b %0,%0":"=r"(x):"0"(x));#elsex= (x>>8) | (x<<8);#endifreturn x;}
2023-07-25 09:08:131

关于scanf与cin哪个快的问题

昨天在OJ上看到一个很水的题,题意就是两个递增序列,输出合并后新序列的中值(详细描述可参见我的另一篇文章http://hi.baidu.com/i5love1you9/blog/item/250f57d671b6f41aa08bb721.html)。当时也闲来无事,于是决定动手写写。刚开始也没怎么在意,认为该题随便都能AC。可提交的结果却TLE了,当时就郁闷了,这算法不可能会有问题啊,不就是一个简单的归并而已,我写的再搓也不可能会TLE啊(小小地自恋一下,哈哈)。我坚信算法肯定是没问题的,那问题究竟出在哪儿了呢?很快便锁定问题的症结在于输入输出,其实刚开始并不确定,虽然很早以前就知道cin,cout比scanf,printf要慢,可一直没在意,认为即使有差别也不会太大吧,但这次“血淋淋”的事实就是cin,cout就TLC,scanf,printf就AC了。于是,一个问题“cin,cout与scanf,printf速度上的差别到底有多大”便出现在脑海中。晚上跑步的时候,将该问题告诉了霏哥,霏哥测试了cin与scanf,但结果却大大出乎了我们的预料,cin竟然比scanf快!怎么回事?这不可能啊,难道霏哥的方法不对,这也不大可能啊(我可是绝对相信霏哥的哦,哈哈)。带着诸多疑问,我决定自己亲自测测。于是编写了如下代码:(1)随机生成1000000个数,并将它们写到文件data中#include <iostream>#include <fstream>#include <cstdlib>using namespace std;const int NUM = 1000000;int main(){ofstream file("data");for(int i = 0 ; i < NUM ; i++){file<<rand()<<" ";if((i+1)%20 == 0)file<<endl;}return 0;}(2)测试cin读取这1000000个数所用的时间#include <iostream>#include <ctime>#include <cstdio>using namespace std;const int NUM = 1000000;int main(){freopen("data","r",stdin);int n,start,end;start = clock();for(int i = 0 ; i < NUM ; i++)cin>>n;end = clock();cout<<double(end-start)/CLOCKS_PER_SEC<<endl;return 0;}(3)测试scanf读取这1000000个数所用的时间#include <ctime>#include <cstdio>const int NUM = 1000000;int main(){freopen("data","r",stdin);int n,start,end;start = clock();for(int i = 0 ; i < NUM ; i++)scanf("%d",&n);end = clock();printf("%lf ",double(end-start)/CLOCKS_PER_SEC);return 0;}在VS1010上测试的结果是:cin 0.234s,scanf 0.421s。怎么回事?真的如霏哥所测的,cin竟然比scanf快。这下我彻底懵了,这到底是怎么回事? 于是上网百度,找了好久才看到相关一篇文章,作者分别测试了linux和windows平台上常用的几款编译器下scanf和cin的速度,结果显示scanf至少要比cin快一倍左右。文中还指出cin慢的原因是,默认情况,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时cout和stdout也一样,两者混用不会输出顺序错乱。正因为这个兼容性的特性,导致cin有许多额外的开销,如何禁用这个特性呢?只需一个语句std::ios::sync_with_stdio(false);,这样就可以取消cin于stdin的同步了,此时的cin就与scanf差不多了。但是为什么我在VS2010上测试的结果却大相径庭呢?莫非是测试方法不对?这不可能啊,我个人这点自信还是有的。那这到底是什么原因呢?带着满脑子的疑问和不解,我继续看着那篇文章,终于在评论部分,有位网友提到,cin、cout是在编译期间就决定了读入变量的类型。而scanf()是在运行期决定的,编译器无法优化,而且还要识别字符串。理论上scanf比cin要慢很多,实际上快的原因是很多编译器对cin、cout的处理过于保守。按着这位网友的说法,理论上cin,cout比scanf,printf要快,实际中是由于编译器的处理方式导致了scanf,printf比cin,cout快了。带着疑问,我又用g++测试了一下,当然没有带任何优化选项,g++版本为4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)。结果果然是我预期的:cin 1.1s ,scanf 0.41s。这似乎证实了理论上cin,cout比scanf,printf要快,实际中是由于编译器的处理方式导致了scanf,printf比cin,cout快了,至少我的实验结果是和这个说法稳合的。也许还有其他的原因,恳请各位牛人网友热心赐教,鄙人将感激不尽。最后,算是一个建议吧,其实你肯定已经听别人说过很多次了,在OJ上做题尽量使用scanf和printf,尤其是有大量数据需要输入输出时,当然你也可以用取消了同步的cin。
2023-07-25 09:08:201

ffmpeg安装在linux哪个目录

Linux下ffmpeg的完整安装最近在做一个企业项目, 期间需要将用户上传的视频转成flv格式或mp4格式并用flash插件在前端播放, 我决定采用ffmpeg (http://www.ffmpeg.org/ )实现. 当然以前也用过ffmpeg, 但是没有安装额外的库, 只是源代码下简单地 ./configure, 最后发现好多功能都用不了, 比如最流行的x264编码器. 所以决心完整地安装一下ffmpeg, 经过两天痛苦地折腾, 终于成功了, 现在将过程记录下来. 主要参考了 [1] 和 [2] 两篇博文, 其中 [1] 是2007年写成的, 其中所提到的依赖库版本比较老, 本人安装的都是相应最新的版本. 首先要安装各种解码器 1、lame lame-3.99.5.tar.gz Url:http://sourceforge.net/project/showfiles.php?group_id=290&package_id=309 安装方法如下:1 tar -zxvf lame-3.99.5.tar.gz 2 cd lame-3.99.5 3 ./configure --enable-shared 4 make 5 make install 2、libogg libogg-1.3.1.tar.gz Url:http://www.xiph.org/downloads/ 安装方法如下:3、libvorbis libvorbis-1.3.3.tar.gz Url:http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz(libvorbis依赖于libogg, 所以libogg必须先于libvorbis安装)安装方法如下:1 ./configure 2 make 3 make install 4、xvid xvidcore-1.3.2.tar.gz Url:http://downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz 安装方法如下:5、x264 latest_x264.tar.bz2 (其中包含的目录是 x264-snapshot-20131023-2245) Url:http://www.videolan.org/developers/x264.html ftp://ftp.videolan.org/pub/videolan/x264/snapshots/ 安装方法如下:1234 1    tar -jxvf latest_x264.tar.bz22 ./configure 3 make 4 make install 6、libdts libdca-0.0.5.tar.bz2Url: http://www.videolan.org/developers/libdca.html安装方法:7、a52 a52dec-0.7.4.tar.gz (这个库从2002年就没有更新过了)http://liba52.sourceforge.net/downloads.html 安装方法:8、faad2 faad2-2.7.tar.gz http://www.audiocoding.com/downloads.html 安装方法9、faac faac-1.28.tar.gz http://www.audiocoding.com/downloads.html安装方法:10、amr-nb amrnb-10.0.0.0.tar.bz2 http://ftp.penguin.cz/pub/users/utx/amr/ ( 从此处下载最新版本 )安装方法:11、amr-wb amrwb-7.0.0.1.tar.bz2 http://ftp.penguin.cz/pub/users/utx/amr/ ( 从此处下载最新版本 )安装方法:1 ./configure 2 make 3 make install 12、最关键的一步, 安装ffmpeg123 1 ./configure --prefix=/usr/local/ffmpeg2 --enable-libmp3lame --enable-libvorbis --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libxvid --enable-postproc --enable-ffserver --enable-ffplay2 make 3 make install 在./configure的时候会报错, 提示说没有libopencore-amrnb和libopencore-amrwb两个库. 我参考了 [2], 使用如下命令安装它们:1 sudo apt-get install libopencore-amrnb-dev libopencore-amrwb-dev如果./configure的时候加入 --enable-shared, 编译安装没有问题. 但是运行ffmpeg命令就会出错:1 relocation error: /usr/local/lib/libavfilter.so.3: symbol sws_get_class, version LIBSWSCALE_2 not defined in file libswscale.so.2 with link time reference;这时可以参考 [3], 大意是说跟gstreamer的动态库冲突了, 要卸载gstreamer. 但是如果卸载了gstreamer我的多媒体软件多不能用了. 所以我卸载了ffmpeg并重新编译成静态库. 安装完之后, 运行ffmpeg成功, 输出如下:12345678910111213 ffmpeg version 2.0.1 Copyright (c) 2000-2013 the FFmpeg developers built on Oct 25 2013 17:40:51 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5) configuration: --prefix=/usr/local/ffmpeg2 --enable-libmp3lame --enable-libvorbis --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libxvid --enable-postproc --enable-ffserver --enable-ffplay libavutil 52. 38.100 / 52. 38.100 libavcodec 55. 18.102 / 55. 18.102 libavformat 55. 12.100 / 55. 12.100 libavdevice 55. 3.100 / 55. 3.100 libavfilter 3. 79.101 / 3. 79.101 libswscale 2. 3.100 / 2. 3.100 libswresample 0. 17.102 / 0. 17.102 libpostproc 52. 3.100 / 52. 3.100Hyper fast Audio and Video encoderusage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...[1] http://yezi.iteye.com/blog/139399[2] http://www.learndiary.com/2011/04/ubuntu-linux-%E4%B8%8B-ffmpeg-%E5%8F%8A-mencoder-%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8%E5%B0%8F%E7%BB%93/[3] http://blog.csdn.net/nil_foc/article/details/6547047
2023-07-25 09:12:061

如何把ffmpeg编译进motion

ffmpeg编译首先解压ffmpeg-0.5.1.tar.bz2,,执行configure命令如下:[plain] view plain copy./configure --cc=arm-linux-gnueabihf-gcc --host-cc=arm-linux-gnueabihf --prefix=/home/***/iWork/common/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux --enable-cross-compile --arch=arm --disable-yasm 编译:[plain] view plain copymake 出现错误如下:[plain] view plain copyarm-linux-gnueabihf-gcc -DHAVE_AV_CONFIG_H -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -I. -I"/home/***/iWork/lamobo/motion-3.2.12-arm-project/ffmpeg-0.5.1" -D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112 -std=c99 -fomit-frame-pointer -g -Wdeclaration-after-statement -Wall -Wno-switch -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wno-pointer-sign -Wcast-qual -Wwrite-strings -Wtype-limits -Wundef -O3 -fno-math-errno -fno-signed-zeros -c -o libavcodec/dsputil.o libavcodec/dsputil.c /tmp/ccOmDdh7.s: Assembler messages: /tmp/ccOmDdh7.s:51789: Error: thumb conditional instruction should be in IT block -- `movgt fp,r9" /tmp/ccOmDdh7.s:51790: Error: thumb conditional instruction should be in IT block -- `movgt r9,r8" /tmp/ccOmDdh7.s:51792: Error: thumb conditional instruction should be in IT block -- `movle r9,r7" /tmp/ccOmDdh7.s:51794: Error: thumb conditional instruction should be in IT block -- `movgt fp,r9" /tmp/ccOmDdh7.s:51889: Error: thumb conditional instruction should be in IT block -- `movgt r9,r8" /tmp/ccOmDdh7.s:51890: Error: thumb conditional instruction should be in IT block -- `movgt r8,ip" /tmp/ccOmDdh7.s:51892: Error: thumb conditional instruction should be in IT block -- `movle r8,r6" /tmp/ccOmDdh7.s:51894: Error: thumb conditional instruction should be in IT block -- `movgt r9,r8" make: *** [libavcodec/dsputil.o] Error 1 这需要修改~/ffmpeg-0.5.1/config.mak,在OPTFLAGS(line:16)选项中添加:[plain] view plain copy-Wa,-mimplicit-it=thumb 加入这句的意思是在使用Thumb ISA指令编译时自动产生“IT”指令。 继续编译,又报错:[plain] view plain copystrip: Unable to recognise the format of the input file `ffmpeg" 这是strip没有使用交叉编译的版本所致,由于此时我们需要的库文件已经编成,所以这个错误可以忽略不计,修改config.mak中的strip为arm-linux-gnueabihf-strip,继续让编译完成motion编译motion中的ffmpeg.c是对ffmpeg api的封装,向其他模块提供功能。如在主程序文件motion.c中[cpp] view plain copy//......#ifdef HAVE_FFMPEG/* FFMpeg initialization is only performed if FFMpeg support was found* and not disabled during the configure phase.*/ffmpeg_init(); #endif /* HAVE_FFMPEG *///...... 这里ffmpeg_init就是ffmpeg.c中封装的方法:[cpp] view plain copyvoid ffmpeg_init() {motion_log(LOG_INFO, 0, "ffmpeg LIBAVCODEC_BUILD %d LIBAVFORMAT_BUILD %d", LIBAVCODEC_BUILD, LIBAVFORMAT_BUILD);av_register_all();#if LIBAVCODEC_BUILD > 4680av_log_set_callback( (void *)ffmpeg_avcodec_log ); #endif/* Copy the functions to use for the append file protocol from the standard* file protocol.*/mpeg1_file_protocol.url_read = file_protocol.url_read;mpeg1_file_protocol.url_write = file_protocol.url_write;mpeg1_file_protocol.url_seek = file_protocol.url_seek;mpeg1_file_protocol.url_close = file_protocol.url_close;/* Register the append file protocol. */ #if LIBAVFORMAT_BUILD >= (52<<16 | 31<<8)av_register_protocol(&mpeg1_file_protocol); #elseregister_protocol(&mpeg1_file_protocol); #endif } 我们需要在motion的Makefile中加入对ffmpeg模块的编译,并且打开HAVE_FFMPEG等开关。首先执行configure如下:[plain] view plain copy./configure CC=arm-linux-gnueabihf-gcc --host=arm-linux-gnueabihf --prefix=/home/stewart/iWork/common/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux 生成Makefile,在OBJ选项中添加ffmpeg.o:[plain] view plain copyOBJ = ffmpeg.o motion.o conf.o draw.o jpegutils.o $(VIDEO_OBJ) netcam.o netcam_ftp.o netcam_jpeg.o netcam_wget.o track.o alg.o event.o picture.o rotate.o webhttpd.o webcam.o 在CFLAGS选项中添加-DHAVE_FFMPEG -DFFMPEG_NEW_INCLUDES -DHAVE_FFMPEG_NEW的定义,加入libjpeg头文件搜索目录[plain] view plain copylibdir = ${prefix}/lib incdir = ${prefix}/include [plain] view plain copyCFLAGS = -g -O2 -DHAVE_FFMPEG -DFFMPEG_NEW_INCLUDES -DHAVE_FFMPEG_NEW -D_REENTRANT-DMOTION_V4L2 -DMOTION_V4L2_OLD -DTYPE_32BIT="int" -DHAVE_BSWAP -Wall-DVERSION="3.2.12" -Dsysconfdir="$( sysconfdir)" 在LIBS中加入对ffmpeg库的支持:[plain] view plain copyLIBS = -L${libdir} -static -lavformat -lavcodec -lavutil -ljpeg -lm -lpthread 预备工作完成,make,编译报错:[plain] view plain copymotion.h:44:28: fatal error: linux/videodev.h: No such file or directory compilation terminated. 由于linux-2.4以上的内核已经取消了videodev.h文件,需要安装libv4l-dev,然后将motion.h,video.h中的[plain] view plain copy#include <linux/videodev.h> 修改为[cpp] view plain copy#include <libv4l1-videodev.h> 继续,又报错:[plain] view plain copytrack.c: In function ‘uvc_center": track.c:587:29: error: storage size of ‘control_s" isn"t known track.c:589:24: error: ‘V4L2_CID_PRIVATE_BASE" undeclared (first use in this function) track.c:589:24: note: each undeclared identifier is reported only once for each function it appears in track.c:592:24: error: ‘VIDIOC_S_CTRL" undeclared (first use in this function) track.c:601:31: error: storage size of ‘queryctrl" isn"t known track.c:605:24: error: ‘VIDIOC_QUERYCTRL" undeclared (first use in this function) track.c:601:31: warning: unused variable ‘queryctrl" [-Wunused-variable] track.c:587:29: warning: unused variable ‘control_s" [-Wunused-variable] track.c:636:25: error: storage size of ‘control_s" isn"t known track.c:636:25: warning: unused variable ‘control_s" [-Wunused-variable] track.c: In function ‘uvc_move": track.c:724:29: error: storage size of ‘control_s" isn"t known track.c:726:24: error: ‘V4L2_CID_PRIVATE_BASE" undeclared (first use in this function) track.c:729:24: error: ‘VIDIOC_S_CTRL" undeclared (first use in this function) track.c:724:29: warning: unused variable ‘control_s" [-Wunused-variable] track.c:779:25: error: storage size of ‘control_s" isn"t known track.c:779:25: warning: unused variable ‘control_s" [-Wunused-variable] make: *** [track.o] Error 1 在track.c中添加:[plain] view plain copy#include <linux/videodev2.h> 继续,报错(怎么还有啊?):[plain] view plain copygcc -L/usr/local/lib -o motion motion.o conf.o draw.o jpegutils.o video.o video2.o video_common.o netcam.o netcam_ftp.o netcam_jpeg.o netcam_wget.o track.o alg.o event.o picture.o rotate.o webhttpd.o webcam.o ffmpeg.o -lm -lpthread -ljpeg -L/usr/local/lib -lavformat -lavcodec -lavutil -lm -lz /usr/local/lib/libavformat.a(file.o):(.data+0x60): multiple definition of `file_protocol" ffmpeg.o:(.data+0x0): first defined here collect2: ld returned 1 exit status 原来结构体file_protocol在libavformat.a和ffmpeg.o中重复定义了,分别打开两个定义:[cpp] view plain copy//libavformat/file.c:85 URLProtocol file_protocol = {"file",file_open,file_read,file_write,file_seek,file_close, }; [cpp] view plain copy//ffmpeg.c URLProtocol file_protocol = {"file",file_open,file_read,file_write,file_seek,file_close, #if LIBAVFORMAT_BUILD >= (52<<16 | 31<<8)NULL,NULL,NULL, #endif }; 将libavformat/file.c中的file_protocol定义注掉,重新编译一份libavformat.a。然后继续编译motion,又报错:[plain] view plain copy/home/xxx/iWork/Thrid_party/ffmpeg-0.5.1/libavformat/matroskadec.c:917: undefined reference to `BZ2_bzDecompressInit" /home/xxx/iWork/Thrid_party/ffmpeg-0.5.1/libavformat/matroskadec.c:926: undefined reference to `BZ2_bzDecompress" /home/xxx/iWork/Thrid_party/ffmpeg-0.5.1/libavformat/matroskadec.c:929: undefined reference to `BZ2_bzDecompressEnd" 这个需要libbz2库,下载地址http://www.bzip.org/downloads.html编译安装libbz2后将-lbz2加入motion的Makefile的LIBS选项:[plain] view plain copyLIBS = -lpthread -ljpeg -L/usr/lib -lavformat -lavcodec -lavutil -lm -lz -lbz2
2023-07-25 09:12:131

如何把ffmpeg编译进motion

ffmpeg编译首先解压ffmpeg-0.5.1.tar.bz2,,执行configure命令如下:[plain] view plain copy./configure --cc=arm-linux-gnueabihf-gcc --host-cc=arm-linux-gnueabihf --prefix=/home/***/iWork/common/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux --enable-cross-compile --arch=arm --disable-yasm 编译:[plain] view plain copymake 出现错误如下:[plain] view plain copyarm-linux-gnueabihf-gcc -DHAVE_AV_CONFIG_H -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -I. -I"/home/***/iWork/lamobo/motion-3.2.12-arm-project/ffmpeg-0.5.1" -D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112 -std=c99 -fomit-frame-pointer -g -Wdeclaration-after-statement -Wall -Wno-switch -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wno-pointer-sign -Wcast-qual -Wwrite-strings -Wtype-limits -Wundef -O3 -fno-math-errno -fno-signed-zeros -c -o libavcodec/dsputil.o libavcodec/dsputil.c /tmp/ccOmDdh7.s: Assembler messages: /tmp/ccOmDdh7.s:51789: Error: thumb conditional instruction should be in IT block -- `movgt fp,r9" /tmp/ccOmDdh7.s:51790: Error: thumb conditional instruction should be in IT block -- `movgt r9,r8" /tmp/ccOmDdh7.s:51792: Error: thumb conditional instruction should be in IT block -- `movle r9,r7" /tmp/ccOmDdh7.s:51794: Error: thumb conditional instruction should be in IT block -- `movgt fp,r9" /tmp/ccOmDdh7.s:51889: Error: thumb conditional instruction should be in IT block -- `movgt r9,r8" /tmp/ccOmDdh7.s:51890: Error: thumb conditional instruction should be in IT block -- `movgt r8,ip" /tmp/ccOmDdh7.s:51892: Error: thumb conditional instruction should be in IT block -- `movle r8,r6" /tmp/ccOmDdh7.s:51894: Error: thumb conditional instruction should be in IT block -- `movgt r9,r8" make: *** [libavcodec/dsputil.o] Error 1 这需要修改~/ffmpeg-0.5.1/config.mak,在OPTFLAGS(line:16)选项中添加:[plain] view plain copy-Wa,-mimplicit-it=thumb 加入这句的意思是在使用Thumb ISA指令编译时自动产生“IT”指令。 继续编译,又报错:[plain] view plain copystrip: Unable to recognise the format of the input file `ffmpeg" 这是strip没有使用交叉编译的版本所致,由于此时我们需要的库文件已经编成,所以这个错误可以忽略不计,修改config.mak中的strip为arm-linux-gnueabihf-strip,继续让编译完成motion编译motion中的ffmpeg.c是对ffmpeg api的封装,向其他模块提供功能。如在主程序文件motion.c中[cpp] view plain copy//...... #ifdef HAVE_FFMPEG /* FFMpeg initialization is only performed if FFMpeg support was found * and not disabled during the configure phase. */ ffmpeg_init(); #endif /* HAVE_FFMPEG */ //...... 这里ffmpeg_init就是ffmpeg.c中封装的方法:[cpp] view plain copyvoid ffmpeg_init() { motion_log(LOG_INFO, 0, "ffmpeg LIBAVCODEC_BUILD %d LIBAVFORMAT_BUILD %d", LIBAVCODEC_BUILD, LIBAVFORMAT_BUILD); av_register_all(); #if LIBAVCODEC_BUILD > 4680 av_log_set_callback( (void *)ffmpeg_avcodec_log ); #endif /* Copy the functions to use for the append file protocol from the standard * file protocol. */ mpeg1_file_protocol.url_read = file_protocol.url_read; mpeg1_file_protocol.url_write = file_protocol.url_write; mpeg1_file_protocol.url_seek = file_protocol.url_seek; mpeg1_file_protocol.url_close = file_protocol.url_close; /* Register the append file protocol. */ #if LIBAVFORMAT_BUILD >= (52<<16 | 31<<8) av_register_protocol(&mpeg1_file_protocol); #else register_protocol(&mpeg1_file_protocol); #endif } 我们需要在motion的Makefile中加入对ffmpeg模块的编译,并且打开HAVE_FFMPEG等开关。首先执行configure如下:[plain] view plain copy./configure CC=arm-linux-gnueabihf-gcc --host=arm-linux-gnueabihf --prefix=/home/stewart/iWork/common/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux 生成Makefile,在OBJ选项中添加ffmpeg.o:[plain] view plain copyOBJ = ffmpeg.o motion.o conf.o draw.o jpegutils.o $(VIDEO_OBJ) netcam.o netcam_ftp.o netcam_jpeg.o netcam_wget.o track.o alg.o event.o picture.o rotate.o webhttpd.o webcam.o 在CFLAGS选项中添加-DHAVE_FFMPEG -DFFMPEG_NEW_INCLUDES -DHAVE_FFMPEG_NEW的定义,加入libjpeg头文件搜索目录[plain] view plain copylibdir = ${prefix}/lib incdir = ${prefix}/include [plain] view plain copyCFLAGS = -g -O2 -DHAVE_FFMPEG -DFFMPEG_NEW_INCLUDES -DHAVE_FFMPEG_NEW -D_REENTRANT -DMOTION_V4L2 -DMOTION_V4L2_OLD -DTYPE_32BIT="int" -DHAVE_BSWAP -Wall -DVERSION="3.2.12" -Dsysconfdir="$( sysconfdir)" 在LIBS中加入对ffmpeg库的支持:[plain] view plain copyLIBS = -L${libdir} -static -lavformat -lavcodec -lavutil -ljpeg -lm -lpthread 预备工作完成,make,编译报错:[plain] view plain copymotion.h:44:28: fatal error: linux/videodev.h: No such file or directory compilation terminated. 由于linux-2.4以上的内核已经取消了videodev.h文件,需要安装libv4l-dev,然后将motion.h,video.h中的[plain] view plain copy#include <linux/videodev.h> 修改为[cpp] view plain copy#include <libv4l1-videodev.h> 继续,又报错:[plain] view plain copytrack.c: In function ‘uvc_center": track.c:587:29: error: storage size of ‘control_s" isn"t known track.c:589:24: error: ‘V4L2_CID_PRIVATE_BASE" undeclared (first use in this function) track.c:589:24: note: each undeclared identifier is reported only once for each function it appears in track.c:592:24: error: ‘VIDIOC_S_CTRL" undeclared (first use in this function) track.c:601:31: error: storage size of ‘queryctrl" isn"t known track.c:605:24: error: ‘VIDIOC_QUERYCTRL" undeclared (first use in this function) track.c:601:31: warning: unused variable ‘queryctrl" [-Wunused-variable] track.c:587:29: warning: unused variable ‘control_s" [-Wunused-variable] track.c:636:25: error: storage size of ‘control_s" isn"t known track.c:636:25: warning: unused variable ‘control_s" [-Wunused-variable] track.c: In function ‘uvc_move": track.c:724:29: error: storage size of ‘control_s" isn"t known track.c:726:24: error: ‘V4L2_CID_PRIVATE_BASE" undeclared (first use in this function) track.c:729:24: error: ‘VIDIOC_S_CTRL" undeclared (first use in this function) track.c:724:29: warning: unused variable ‘control_s" [-Wunused-variable] track.c:779:25: error: storage size of ‘control_s" isn"t known track.c:779:25: warning: unused variable ‘control_s" [-Wunused-variable] make: *** [track.o] Error 1 在track.c中添加:[plain] view plain copy#include <linux/videodev2.h> 继续,报错(怎么还有啊?):[plain] view plain copygcc -L/usr/local/lib -o motion motion.o conf.o draw.o jpegutils.o video.o video2.o video_common.o netcam.o netcam_ftp.o netcam_jpeg.o netcam_wget.o track.o alg.o event.o picture.o rotate.o webhttpd.o webcam.o ffmpeg.o -lm -lpthread -ljpeg -L/usr/local/lib -lavformat -lavcodec -lavutil -lm -lz /usr/local/lib/libavformat.a(file.o):(.data+0x60): multiple definition of `file_protocol" ffmpeg.o:(.data+0x0): first defined here collect2: ld returned 1 exit status 原来结构体file_protocol在libavformat.a和ffmpeg.o中重复定义了,分别打开两个定义:[cpp] view plain copy//libavformat/file.c:85 URLProtocol file_protocol = { "file", file_open, file_read, file_write, file_seek, file_close, }; [cpp] view plain copy//ffmpeg.c URLProtocol file_protocol = { "file", file_open, file_read, file_write, file_seek, file_close, #if LIBAVFORMAT_BUILD >= (52<<16 | 31<<8) NULL, NULL, NULL, #endif }; 将libavformat/file.c中的file_protocol定义注掉,重新编译一份libavformat.a。然后继续编译motion,又报错:[plain] view plain copy/home/xxx/iWork/Thrid_party/ffmpeg-0.5.1/libavformat/matroskadec.c:917: undefined reference to `BZ2_bzDecompressInit" /home/xxx/iWork/Thrid_party/ffmpeg-0.5.1/libavformat/matroskadec.c:926: undefined reference to `BZ2_bzDecompress" /home/xxx/iWork/Thrid_party/ffmpeg-0.5.1/libavformat/matroskadec.c:929: undefined reference to `BZ2_bzDecompressEnd" 这个需要libbz2库,下载地址http://www.bzip.org/downloads.html编译安装libbz2后将-lbz2加入motion的Makefile的LIBS选项:[plain] view plain copyLIBS = -lpthread -ljpeg -L/usr/lib -lavformat -lavcodec -lavutil -lm -lz -lbz2
2023-07-25 09:12:231

为什么子函数没有写返回值也可以输出正确

VS上编译错误,在gcc上的确是会返回正确的结果。看了gcc的反汇编代码,明白了原因。gcc在实现 a > b 这样的操作的时候,会把一个操作数放eax寄存器,然后z =a 时,会利用eax作中转,意思是先把a的值放eax,然后再由eax复制到z的内存中。一般函数都是通过eax寄存器来返回值的,所以main函数中可以顺利的拿到z的值。原因是知道了,不过这行为挺诡异的啊。如果不相信我的解释,你可以试试再看一个类似判断,你看看最后的返回值是什么就明白了。
2023-07-25 09:12:334