程序中的bug解决
庞大时间节点分析,可以在程序中加入log书写程序来进行编写,将数据到出到文件,通过excel进行分析。
log编写的方法:
编写C++的容器(不断写入容器,再关闭时候一次放入)双线程的log(一面主线程工作,一面线程用来记录log)log的编写思想
AG215S的通信可以用作全双工通信,双线程通信时候发生堵塞。
解决过程:将整个通信的程序做成半双工的主从机应答程序,在解决时候发现主机总会堵塞,从机没有问题,主机是发送线程开启在前无延迟,从机是接收线程开启再后中间有延迟函数,由此判断可能是延迟的问题。结论: 将两个接收线程开启之间添入延时函数,这样才不会堵塞,必须错时开启。
两台设备如果服务开启失败,AG18的license过期了。解决方案:沟通移远的工程师要一个,用QFlash进行烧录。
三个线程一个线程tcp发送,一个线程加锁从tcp接收线程copy数据,一个线程tcp读取,测试过程中总会出现一些丢包的情况。解决过程是将代码进行分块测试,发现加锁的逻辑代码并不会造成丢包,各个线程挨个屏蔽测试发现并无影响,最后在第三个线程中发现从v2v的接收函数和tcp的发送放入一个线程 ...
ROS
ROS简介参考教程:cn - ROS Wiki
ros下编译一个hello world程序
创建工作空间,在终端上创建一个工程文件夹名为hello_ws,并在src目录下创建一个ros包
12345mkdir -p hello_ws/srccd hello_wscatkin_makecd /srccatkin_create_pkg hello_world roscpp std_msgs
roscpp和std_msgs是hello_world的依赖项。
进入hello_world包的目录,并创建一个名为hello.cpp`的C++源文件:
12cd ~/hello_ws/src/hello_world/srcvi hello.cpp
编辑hello.cpp文件,并添加以下内容:
123456789#include "ros/ros.h"#include "std_msgs/String.h"#include <stdio.h>int main(int argc, char **argv){ printf(&qu ...
TCP
tcpTCP(传输控制协议,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的通信协议。它是互联网协议套件(TCP/IP协议栈)的一部分,用于在网络上可靠地传输数据。
以下是 TCP 协议的主要特点和介绍:
可靠性: TCP 提供可靠的、面向连接的通信。通过使用确认机制和超时重传机制,确保数据的可靠性传输。如果数据包在传输过程中丢失或损坏,TCP 会负责重新发送丢失的数据。
面向连接: 在进行数据传输之前,TCP 首先在通信的两端建立连接。这个连接是全双工的,双方可以同时进行数据的收发。连接的建立、维护和释放是由 TCP 协议负责的。
流控制: TCP 使用流控制机制来防止发送方发送过多的数据导致接收方无法处理。通过窗口大小的动态调整,TCP 可以在发送和接收之间实现平衡。
拥塞控制: TCP 通过拥塞控制机制来适应网络的变化。它通过监测网络的拥塞状况来调整数据的传输速率,以避免过多的数据导致网络拥塞。
字节流传输: TCP 将数据看作是字节流,而不是分割成独立的消息。这意味着发送的数据可以按照任意大小的块进行划分,而 ...
嵌入式面试题
memcpy和strcpy的区别?
1)、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2)、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符”\0”才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3)、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
信号量与互斥锁的区别?
(1)、互斥锁用于线程的互斥,信号量用于线程的同步。
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
(2)、互斥量值只能为0/1,信号量值可以为非负整数。
也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥 ...
libusb库
libusb库学习libusb是一个使用C编写的库,它提供USB设备的通用的访问方法。APP通过它,可以方便地访问USB设备,无需编写USB设备驱动程序。
libusb源码的移植通过网址下载源码https://github.com/libusb/libusb/releases,之后进行交叉编译。
1./configure --host=arm-linux --disable-udev --prefix=/home/moss/linux/tool/libusb --CC=arm-linux-gnueabihf-gcc
配置完成后就可以进行编译了,
12makemake install
之后可以发现生成了libusb.h文件,但是缺少里面调用的usb.h文件,所以需要将usbcompat的源码包进行交叉编译。
下载usbcompat源码包
1./configure --host=arm-linux --disable-udev --prefix=/home/moss/linux/tool/libusb --CC=arm-linux-gnueabihf-gcc
配置完以后进行编译
12 ...
cmake的学习
Cmake简易工程学习cmake 是一个跨平台的自动构建工具 ,用来生成Makefile,不用动手编写Makefile。
对于一个初始的C语言程序来说使用cmke进行构建。
12345#include <stdio.h>int main(void){ printf("hello world");}
创建CMakeLists.txt文件,CMakeLists.txt文件会被cmake工具解析 ,写入内容
12project(HELLO) #设置工程名称add_executable(hello ./main.c) #第一个参数生成可执行文件用,空格分开传入的参数,第二个参数表示对应的源文件
执行cmake命令
1cmake ./
之后就会生成makefile文件,可以使用make进行编译。
使用out-of-source方式进行构建,来将工程生成的文件何源文件分离开。
然后在工程目录下创建一个 build 目录
123cd build/cmake ../make
这样 cmake 生成的中间文件以及 make 编译生成的可 ...
USB协议学习
USBUSB作为通用串行总线,可以看到这种总线具备通用性。它是以主机为主,设备为从的主从通讯模式,
USB描述符
所有USB描述符都是存储在USB设备中的。USB描述符有设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符,HID类设备会多出HID描述符、报告描述符、物理描述符三种描述符,描述符架构如下图。
USB传输
USB传输分为控制传输、同步传输、批量传输、中断传输四种,其中批量传输、同步传输每次传输需要一个或多个事务,中断传输一次需要一个事务,控制传输包括三个过程(建立过程、数据过程、状态过程),建立过程和状态过程分别需要一个事务,数据过程则可能包含0个多个事务。看实例协议分析,要知道transfer是传输,transaction为事务。
控制传输有三种类型,控制写传输、控制读传输、无数据的控制传输三种。控制写传输和控制读传输数据阶段是根据传输情况可有可无,无数据控制传输无数据阶段。
USB事务
事务通常由两三个包组成:令牌包,数据包和握手包。为什么说是通常呢?因为有一个特例同步传输的事务中没有握手包,只有令牌包和数据包。事务就是完成一件事的意思,完成一个事务 ...
WIFI驱动
wifi驱动的移植使用的wifi模块为SDIO WIFI,芯片为RTL8189FTV,这款产品是给驱动的,只需要将其添加到内核编译,就可以使用。
使用RTL8XXX WIFI 驱动源码-> realtek 将这个目录包放入Linux 内核源码中的 drivers/net/wireless 目录下,此目录下存放着所有 WIFI 驱动文件 。
修改 drivers/net/wireless/Kconfig
打开这个文件在最后加入
1source "drivers/net/wireless/realtek/Kconfig"
添加到 drivers/net/wireless/Kconfig 中的内容
修改 drivers/net/wireless/Makefile
打开文件在最后加入
1obj-y += realtek/
这样就能在内核菜单中配置它这个选项了。
配置内核配置wifi
配置支持IEEE802.11
最后编译WIFI驱动
使用sd ...
学习计划
目前先打算做个规划进行一段时间的复习,并且准备开题报告。复习的主要内容如下:
复习数组和结构体的传输参数,堆栈,内存的概念对于驱动开发的复习每天进行代码的练习高级IO的复习进程、线程的复习
硬件传输
双闪存模式,这也是ASPI最常用的接口协议模式之一。
双闪存模式。即QSPI 使用两个外部四线 SPI Flash(FLASH 1 和 FLASH 2),在每个周期中发送/接收 8 位(在 DDR 模式下为16 位),能够有效地将吞吐量和容量扩大一倍。每个 Flash 使用同一个 CLK 并可选择使用同一个 nCS 信号,但其 IO0、IO1、IO2 和 IO3 信号是各自独立的。双闪存模式可与单比特模式、双比特模式以及四比特模式结合使用,也可与 SDR 或 DDR 模式相结合。在双闪存模式下读取 Flash 状态寄存器时,需要读取的字节数是单闪存模式下的 2 倍。在双闪存模式下,FLASH 1 接口信号的行为基本上与正常模式下相同。在指令、地址、交替字节以及空指令周期阶段,FLASH 2 接口信号具有与 FLASH 1 接口信号完全相同的波形。
IIC协议对接口电平时序的理解,开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。应答信号:接收数据的IC在接收到8bit数据后,向发送数据的 ...