硬要用tplayerdemo播放2888x2888是可以运行, 但是画面(从上之下)的下半部分会出现绿油油马赛克失真.
同样的, 通过decodertest取YV12同样发现上述的失真现象.
想请教:
- 这是硬解的上限了吗?
- 只取样, 不对帧率作要求的话, 硬解还能走通吗?
硬要用tplayerdemo播放2888x2888是可以运行, 但是画面(从上之下)的下半部分会出现绿油油马赛克失真.
同样的, 通过decodertest取YV12同样发现上述的失真现象.
想请教:
@mangogeek 碰上冬天这种可怕的有静电季节,赶紧把外壳也做了吧。
@wadedeng
你翻翻我的一些帖子,移植应用或者库的。
你完全可以照抄我交叉编译cmake的写法。
https://gitee.com/YJHmath/image-transmission-d1-tina/blob/master/CMakeLists.txt
@wadedeng busybox就是一个模仿linux常用程序的程序,好度集成了呗。
这方面应该看看韦东山老师的linux驱动入门课。(不用钱)
@wadedeng 写/魔改 uboot kernel busybox 用SI.
写应用,有cmake加有提示报错就好
@wadedeng 善用 find . -name "*.h/c" | xargs grep -irn "(包含的字符串)"
找到相应文件的路径,再酌情打开相应模块目录。
SI就应该只打开你要看和写的部分文件。它还有个引用的功能,只需要指向编译器的头文件或者tina头文件路径即可,切勿添加这些文件进项目。
最大的程序无非uboot, kernel, busybox等,都会有独立配置,不妨make menuconfig试试。至少对应3个SI项目。
比如你只要看fbviewer这个显示图像的函数,你只需要打开对应方法目录添加相应源文件看实现即可。
记住SI只是看和改大型项目代码的,好看c结构体模样等等。
写/创造代码的话,最好用cmake+qtcreator/clion.
看看怎么把采集先干起来先....
也不知道有没有配套的VB, ISP, VENC等等....
MIPI采集应该比V4L UVC快吧
如题, 想编个串口通信程序.
但Tina默认只有/dev/ttyS0, /dev/ttyS1两个串口设备.
我该如何启用更多串口呢?
在Tina SDK目录下 按官方文档加载环境:
source build/envsetup.sh
lunch d1_nezha-tina
make menuconfig
然后沿路径进入:
Base system->BusyBox->Network Utilities->telnetd
功能全开.(telnet工具可选, 除非你要telnet到别的设备)
如图:
看懂了陈硕大佬的muduo库, 才算从C++入门到现代C++(应该从C++11算起). 最喜欢大佬做库的同时顺便写本书, 踏踏实实收稿费, 谁说搞开源不赚钱?
库地址:
https://github.com/chenshuo/muduo.git
static const int kMaxNumericSize = 48;
// 该行报错:kMaxNumericSize is large enough
static_assert(kMaxNumericSize - 10 > std::numeric_limits<long double>::digi
"kMaxNumericSize is large enough");
于是注释上面的问题.
暴力过编译后文件修改差异:
# git diff
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6071a4e..e151a00 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,8 +1,13 @@
cmake_minimum_required(VERSION 2.6)
+set(CMAKE_CROSSCOMPILING TRUE)
+set(CMAKE_C_COMPILER "riscv64-unknown-linux-gnu-gcc")
+set(CMAKE_CXX_COMPILER "riscv64-unknown-linux-gnu-g++")
+set(CMAKE_FIND_ROOT_PATH /home/tao/tina-d1-open/out/d1-nezha/staging_dir/toolchain)
+
project(muduo C CXX)
-enable_testing()
+#enable_testing()
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release")
@@ -20,7 +25,7 @@ set(CXX_FLAGS
-D_FILE_OFFSET_BITS=64
-Wall
-Wextra
- -Werror
+ # -Werror
-Wconversion
-Wno-unused-parameter
-Wold-style-cast
@@ -28,7 +33,7 @@ set(CXX_FLAGS
-Wpointer-arith
-Wshadow
-Wwrite-strings
- -march=native
+ # -march=native
# -MMD
-std=c++11
-rdynamic
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index bed84ad..1f3f021 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -34,7 +34,7 @@ else()
add_subdirectory(curl EXCLUDE_FROM_ALL)
endif()
-if(PROTOBUF_FOUND)
+if(FALSE)
add_subdirectory(ace/logging)
add_subdirectory(protobuf)
else()
diff --git a/muduo/base/CMakeLists.txt b/muduo/base/CMakeLists.txt
index 96e2d02..7ff4597 100644
--- a/muduo/base/CMakeLists.txt
+++ b/muduo/base/CMakeLists.txt
@@ -30,5 +30,5 @@ file(GLOB HEADERS "*.h")
install(FILES ${HEADERS} DESTINATION include/muduo/base)
if(MUDUO_BUILD_EXAMPLES)
- add_subdirectory(tests)
+ # add_subdirectory(tests)
endif()
diff --git a/muduo/base/LogStream.cc b/muduo/base/LogStream.cc
index cafd5b8..518e742 100644
--- a/muduo/base/LogStream.cc
+++ b/muduo/base/LogStream.cc
@@ -223,14 +223,14 @@ void FixedBuffer<SIZE>::cookieEnd()
void LogStream::staticCheck()
{
- static_assert(kMaxNumericSize - 10 > std::numeric_limits<double>::digits10,
- "kMaxNumericSize is large enough");
- static_assert(kMaxNumericSize - 10 > std::numeric_limits<long double>::digits10,
- "kMaxNumericSize is large enough");
- static_assert(kMaxNumericSize - 10 > std::numeric_limits<long>::digits10,
- "kMaxNumericSize is large enough");
- static_assert(kMaxNumericSize - 10 > std::numeric_limits<long long>::digits10,
- "kMaxNumericSize is large enough");
+ //static_assert(kMaxNumericSize - 10 > std::numeric_limits<double>::digits10,
+ // "kMaxNumericSize is large enough");
+ //static_assert(kMaxNumericSize - 10 > std::numeric_limits<long double>::digits10,
+ // "kMaxNumericSize is large enough");
+ //static_assert(kMaxNumericSize - 10 > std::numeric_limits<long>::digits10,
+ // "kMaxNumericSize is large enough");
+ //static_assert(kMaxNumericSize - 10 > std::numeric_limits<long long>::digits10,
+ // "kMaxNumericSize is large enough");
}
template<typename T>
diff --git a/muduo/net/CMakeLists.txt b/muduo/net/CMakeLists.txt
index 7510d87..28cfffe 100644
--- a/muduo/net/CMakeLists.txt
+++ b/muduo/net/CMakeLists.txt
@@ -60,10 +60,10 @@ if(MUDUO_BUILD_EXAMPLES)
add_subdirectory(tests)
endif()
-if(PROTOBUF_FOUND)
- add_subdirectory(protobuf)
- add_subdirectory(protorpc)
+if(FALSE)
+ add_subdirectory(protobuf)
+ add_subdirectory(protorpc)
else()
- add_subdirectory(protobuf EXCLUDE_FROM_ALL)
- add_subdirectory(protorpc EXCLUDE_FROM_ALL)
+ add_subdirectory(protobuf EXCLUDE_FROM_ALL)
+ add_subdirectory(protorpc EXCLUDE_FROM_ALL)
endif()
过编~RPC走起, TCP应用走起
有时候想静下心来温故而知新, 顺带把书的附带的历程给编到哪吒上.
例程库库:
https://github.com/unpbook/unpv13e.git
编译过程:
# assert 编译器已在环境变量中
./configure --host=riscv64-unknown-linux-gnu CC=riscv64-unknown-linux-gnu-gcc
# libunp.a
cd lib
make all
# 进你所想编译的例程
cd udpcliserv
make all
顺便推介另外两本配套, 均适合放书架供程序猿瞻仰的
@anruliu 后续: 能否解释一下官方文档给出的HDMI指令的含义?
cd /sys/kernel/debug/dispdbg
echo disp0 > name; echo switch1 > command; echo 4 10 0 0 0x4 0x101 0 0 0 8 > param; echo 1 > start;
使用该命令切换到HDMI输出, 显示只占屏幕的左1/3左右. 只能显示图片的局部.
@xiaowenge jpeg转yuv的demo都有了, 输出你们熟悉的肝一下就出来....虽然开源木有钱...
输入telnetd会要求登录
输入
root
123456
后, 就好像telnet自己了
但是外部设备依旧没法远程访问哪吒呀
@tigger 实测不可行, 外部telnet到哪吒报Connection refused.
首先配置wpa_supplicant的配置文件:/etc/wifi/ake.conf
ctrl_interface=/var/run/wpa_supplicant
update_config=1
network={
ssid="(SSID)"
psk="(PWD)"
}
然后
# 主要连接操作
wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wifi/ake.conf -B
# 通过DHCP服务获得IP地址等信息
udhcpc -i wlan0 -B
# 搜索WIFI
wpa_cli -iwlan0 scan
wpa_cli -iwlan0 scan_result
# 检查WiFi连接状态
wpa_cli -iwlan0 status
想开机配置网络和WiFi, 可以修改/etc/init.d/wpa_supplicant文件第48行左右:
if [ x$brlan=="xbr-lan" ]; then
echo "change the default ip address 192.168.1.1"
ifconfig br-lan 192.168.100.1
# 加你所想操作的指令
fi
前端时间带实习生的过程中顺带学习了一下F103调OV2640传感器获取图片,顺带把图像通过以太网抛出。MCU采用状态机写法(整理后开源),通过TCP/UDP传输在PC上解包不要太顺利了.(这里要感谢实习生wyr填好的路)
接下来,主要想把上位机解包程序移植到哪吒开发板上,目标平台:Tina.
哪吒开发板实现TCP/UDP图传:
https://gitee.com/YJHmath/image-transmission-d1-tina
图传协议:
https://docs.qq.com/doc/DVkRZUXhSa3prbXZp
2021年9月30日
一开始着重快速地把协议移植, 所以我会使用cmake工具在win下qtcreator编写, 在Ubuntu20.10交叉编译.
开发语言自然是C++和C混着搭. 因为C++有着丰富的轮子,
程序采用了:
这两个库在哪吒上的编译过程可以参考:
muduo网络库在哪吒上编译
《Unix网络编程》例程库在哪吒上编译
一开始我想把接收到的图片一气呵成地输出到HDMI时, 但发现若将fbviewer目录(tina-d1-open/out/d1-nezha/compile_dir/target/fbviewer)下除main.o外的.o文件链接成静态库(.a), 再编译出来的程序无法正常运行:
root@TinaLinux:/mnt/nfs/tina# ./fbtest
./fbtest: line 1: ELF�8@@
: not found
./fbtest: line 3: syntax error: EOF in backquote substitution
这是一道坎, 望各位大佬指教.
既然验证了链接到静态库存在问题. 那能想到解决思路有3种:
对于下班的闲暇抽空写码的我, 毫不犹豫地选择了第3种.
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/stat.h>
int main()
{
printf("Hello world\n");
char* path = "pic.jpg";
uint32_t ts = 0;
struct stat tmp;
stat(path, &tmp);
uint8_t* image = (uint8_t*)malloc(1600 * 1200 * 3);
int is_need_output = 0;
while(1)
{
stat(path, &tmp);
//printf("st_ctime:%d\n", tmp.st_ctime);
if(ts != tmp.st_ctime)
{
ts = tmp.st_ctime;
is_need_output = 1;
}
if(is_need_output)
{
fh_jpeg_load(path, image, NULL, 1600, 1200);
fb_display(image, NULL, 1600, 1200, 0, 0, 160, 0);
is_need_output = 0;
}
usleep(25 * 1000);
}
free(image);
return 0;
}
既然程序需要频繁地读写, 那就直接放到挂载到RAM的目录吧!
于是乎:
下一步把ncnn的demo整合应该也不是什么难事.
-fpermissive这是错误是可以忽略的.
在CMakeLists.txt加一句
add_compile_options(-fpermissive)
或
set(CMAKE_CXX_FLAGS "-fpermissive ${CMAKE_CXX_FLAGS}")
即可将错误转为警告
@lijyhh
在Tina SDK目录下运行这些脚本
source build/envsetup.sh
lunch d1_nezha-tina
这样环境变量一般是可以了, 因为连系统都能编译出来, 何况是个库呢
@lijyhh 建议用Tina工具链编译东西前, 按照编译Tina SDK的方法, 先加载编译环境:
不皮了. 补充一点:
# -d 是复制快捷方式. *号会把实体也一起复制.
cp -d tina-d1-open/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/riscv64-unknown-linux-gnu/lib64/lp64d/libatomic.so* (target_path)
本着尽可能快完成编译和能用则用的原则, 谈谈编译目前最新的OpenCV 4.5.2编译过程.
▲ 用平头哥的工具链(riscv64-linux-x86_64-20210512)编译出来:
Linux tao 5.8.0-59-generic #66~20.04.1-Ubuntu SMP Thu Jun 17 11:14:10 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
cmake: 3.16.3
工具链选用: (Tina SDK 自带)
tina-d1-open/out/d1-nezha/staging_dir/toolchain/bin/riscv64-unknown-linux-gnu-gcc等...
版本: gcc version 8.1.0 (C-SKY RISCV Tools V1.8.4 B20200702)
要编译的OpenCV版本: 4.5.2
这里先提几个tips:
编译的指令在此. CV目录下的cmake我可能窜改了一下, 在下文补充.
opencv-4.5.2 mkdir build-tina && cd build-tina
# 能编尽编原则, 可自行删减.
cmake \
-DCMAKE_C_COMPILER=riscv64-unknown-linux-gnu-gcc \
-DCMAKE_CXX_COMPILER=riscv64-unknown-linux-gnu-g++ \
-DOPENCV_FORCE_3RDPARTY_BUILD=ON \
-DBUILD_ZLIB=ON \
-DBUILD_SHARED_LIBS=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=./output ..
# 嗯, 是Xeon.
make -j12
CMakeLists.txt的diff:
#diff tmp/opencv-4.5.2/CMakeLists.txt opencv-4.5.2/CMakeLists.txt
223,227c223,224
< OCV_OPTION(BUILD_IPP_IW "Build IPP IW from source" (NOT MINGW OR OPENCV_FORCE_3RDPARTY_BUILD) IF (X86_64 OR X86) AND NOT WINRT )
< OCV_OPTION(BUILD_ITT "Build Intel ITT from source"
< (NOT MINGW OR OPENCV_FORCE_3RDPARTY_BUILD)
< IF (X86_64 OR X86 OR ARM OR AARCH64 OR PPC64 OR PPC64LE) AND NOT WINRT AND NOT APPLE_FRAMEWORK
< )
---
> OCV_OPTION(BUILD_IPP_IW "Build IPP IW from source" ON)
> OCV_OPTION(BUILD_ITT "Build Intel ITT from source" OFF)
416c413
< OCV_OPTION(WITH_ITT "Include Intel ITT support" ON
---
> OCV_OPTION(WITH_ITT "Include Intel ITT support" OFF
614c611
< include(cmake/OpenCVDetectPython.cmake)
---
> # include(cmake/OpenCVDetectPython.cmake)
731a729,730
> set(PYTHON_DEFAULT_AVAILABLE 0)
> set(ENABLE_PYLINT 0)
1454a1454,1456
> set(WITH_IPP 0)
> set(HAVE_IPP 0)
> set(HAVE_IPP_IW 0)
1608a1611,1612
> set(BUILD_opencv_python2 0)
> set(BUILD_opencv_python3 0)
完整的CMakeLists.txt.bmp如下图:
base64 -d CMakeLists.txt.bmp > CMakeLists.txt
![0_1626758920883_CMakeLists.txt.bmp](正在上传 100%)
@shawn227 因为是新的指令集和硬件, 所以差异会有的. 但是, 韦老师(@100ask )也在论坛里, 所以能看懂实践这个帖子就算完成入门啦:使用builroot 2021一键编译生成D1 nezha 系统镜像
@xiaowenge 把哪吒寄去清华,他们期末要写OS……期待用RUST写的OS
@shawn227 那可以开始韦东山的嵌入式Linux的疗程了, uboot, kernel, rootfs......然后基本就可以实现你的创意了
http://download.100ask.net/videos_tutorial/embedded_linux/full_range_phase1/index.html
韦老师, 我一直在上你的高级驱动课!
现在的也入手了D1,
不过好像原生系统的NFS没有启用? 也没有现成的ftp服务器程序,
老师有什么开发调试的建议呢?
@shawn227 弄个Ubuntu做交叉编译环境, 写个hello world先, 参考https://d1.docs.allwinnertech.com/