1.imx6上面直接在ubuntu上用arm-linux-交叉编译工具编译,编完看是直接U盘还是ssh+scp搞出来;imx8到自己客制的文件夹目录里面,配置好当前层的mk和设备树的mk后,到顶部目录export导入环境变量,然后source ,lunch,之后到对应的修改好的目录里面mm单编,编成功后的Log会提示编出来的东西在哪个目录里,一般是out/里面

$ export AARCH64_GCC_CROSS_COMPILE=/opt/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-
$ export CLANG_PATH=/opt/prebuilt-android-clang
$ export ARMGCC_DIR=/opt/gcc-arm-none-eabi-7-2018-q2-update   //这三条是导入环境变量
$ source build/envsetup.sh    //回顶层目录source和lunch
$ bash build/envsetup.sh       //跟source一样,source 不行的时候用bash
$ lunch mek_8q_car-userdebug
$去对应的目录mm

2.暂且用网线连接imx6和imx8,二者的通讯暂用udp;imx6发imx8接,并且把接到的rtc时间同步(写入)到自己的里面作为自己时间。收的这边固定设IP为192.168.100.3

注意:

1)imx8这边把编好的应用程序直接adb push进去,这时候确保先adb root ,之后adb remount,然后再进去;

2)adb push进去的时候,不要push到imx8的/storage下面,去这下面跑应用程序是permission denied,最后是挪到/data下面才跑通的,确保跑之前把应用程序chmod 777一下

代码

发送端:

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>#include <linux/rtc.h>
#include <sys/ioctl.h>
#include <fcntl.h>     //文件io必须定义这个#define RTC_ALM_SET    _IOW('p', 0x07, struct rtc_time) /* Set alarm time  */
#define RTC_ALM_READ    _IOR('p', 0x08, struct rtc_time) /* Read alarm time */
#define RTC_RD_TIME _IOR('p', 0x09, struct rtc_time) /* Read RTC time   */
#define RTC_SET_TIME    _IOW('p', 0x0a, struct rtc_time) /* Set RTC time    */
#define RTC_IRQP_READ   _IOR('p', 0x0b, unsigned long)     /* Read IRQ rate   */
#define RTC_IRQP_SET    _IOW('p', 0x0c, unsigned long)     /* Set IRQ rate    */
#define RTC_EPOCH_READ  _IOR('p', 0x0d, unsigned long)     /* Read epoch      */
#define RTC_EPOCH_SET   _IOW('p', 0x0e, unsigned long)     /* Set epoch       *///前面这些RTC_xxx是定义的io控制,这些要去rtc驱动的.c或者.h里面找#define SERVER_IP "192.168.100.3"   //IP号之间不能有空格void ClientDataHandle_connect_read_write(int socketfd)
{/*int byte, cnt = 0;unsigned char data[1024];struct rtc_device rtc;struct rtc_time tm;while(1){data=rtc_read_time(&rtc,&tm);memset(data, 0, 1024);sprintf(data, "client send data cnt:%d", ++cnt);write(socketfd, data, strlen(data));printf("client write to server successful\n");memset(data, 0, 1024);byte = read(socketfd, data, 1024);  //读取server数据,有数据更新才读取,否则阻塞if(byte == 0){perror("read over");break;}if(byte < 0){perror("read failed");break;}printf("server-->client datelen:%d info:%s\r\n",byte, data);  sleep(5);       }   return;*/
}void ClientDataHandle_connect_recvfrom_sendto(int socketfd)
{/*int cnt = 0, byte = 0;unsigned char data[1024];while(1){memset(data, 0, 1024);sprintf(data, "client send data cnt:%d\n", ++cnt); //sendto(socketfd, data, strlen(data), 0, NULL, 0);memset(data, 0, 1024);//读取server数据,有数据更新才读取,否则阻塞byte = recvfrom(socketfd, data, 1024, 0, NULL, NULL);if(byte == 0){perror("read over");break;}if(byte < 0){perror("read failed");break;}printf("server-->client datelen:%d info:%s\r\n",byte, data); sleep(5);   }   */
}int main(int argc, void *argv[] )
{int socketfd = -1;struct sockaddr_in servaddr;int rtcfd = -1;const char *rtcdev = "/dev/rtc0";int ret = 0;
//  struct rtc_device rtc;struct rtc_time tm;char buf[1024];   //时间保存到这个buf里面,是char,字符memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_addr.s_addr=inet_addr(SERVER_IP);servaddr.sin_port=htons(1025);if( (socketfd = socket(AF_INET, SOCK_DGRAM, 0) ) ==  -1) //socket函数类似于open函数,打开并创建一个socket,AF_INET使用IPV4协议族,SOCK_STREAM为TCP套接口{perror("socket create failed!\n");return -1;}if(connect(socketfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0){perror("socket connect failed\n");return -1;}rtcfd = open(rtcdev,O_RDWR);if(rtcfd == -1){perror("open rtc error!");}while(1){ret = ioctl(rtcfd, RTC_RD_TIME, &tm);    //获取时间printf("[app] ret= %d , tm_sec=%d,tm_min=%d,tm_hour=%d\r\n",ret, tm.tm_sec, tm.tm_min,tm.tm_hour);memset(buf,0,1024);sprintf(buf,"%d:%d:%d\n",tm.tm_hour,tm.tm_min,tm.tm_sec); //这里确保打印出的是字符sendto(socketfd,buf,sizeof(buf),0,NULL,0);sleep(1);/*memset(&servaddr, 0, sizeof(servaddr) );servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = inet_addr(SERVER_IP);servaddr.sin_port = htons(1025);   //1024以后的端口号是动态的可随意取用if(connect(socketfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0 ){perror("socket connect failed!");return -1;}*/}//ClientDataHandle_connect_read_write(socketfd);//效果与下方函数一样//ClientDataHandle_connect_recvfrom_sendto(socketfd);return 0;
}

接收端:

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#define BUF_SIZE 1024
#define SERVER_IP "192.168.100.3"
#define FILE_NAME "1.txt"void ServerDataHandle_recvform_sendto(int fd)
{int byte = 0, cnt = 0;char buf[BUF_SIZE] = {0};socklen_t len = sizeof(struct sockaddr_in);struct sockaddr_in clientaddr;int file_fd=0;file_fd=open(FILE_NAME,O_TRUNC|O_WRONLY);  //这里的打开方式很重要不能改if(file_fd<0){perror("open file err");return ;}if(fd <= 0) {perror("socket fd value err");return ;}while(1){memset(buf, 0, BUF_SIZE );byte = recvfrom(fd, buf, BUF_SIZE, 0, (struct sockaddr *)&clientaddr, &len);   //读取client数据,有数据更新才读取,否则阻塞if(byte == 0)                            //客户端关闭时,读取数据个数为0{printf("sockfd:%d read over\n", fd);break;}if(byte < 0){perror("read failed");  break;}printf("client IP:%s, port:%d, datalen:%d, info:%s\n", inet_ntoa(clientaddr.sin_addr), clientaddr.sin_port, byte, buf );write(file_fd,buf,byte);write(file_fd,"\n",1);fsync(file_fd);memset(buf, 0, BUF_SIZE );sprintf(buf, "server send cnt:%d\n", ++cnt);sendto(fd, buf, strlen(buf), 0, (struct sockaddr *)&clientaddr, sizeof(clientaddr));//sleep(5);//ioctl(listenfd,RTC_SET_TIME,&tm);    }close(fd);close(file_fd);
}int main()
{int listenfd, opt = 1;struct sockaddr_in serveraddr;int time_buf[]={0};listenfd = socket(AF_INET, SOCK_DGRAM, 0);if(listenfd < 0){perror("Create socket fail.");return -1;}    memset( (void*)&serveraddr,0,sizeof(struct sockaddr_in) );serveraddr.sin_family             = AF_INET;serveraddr.sin_port      = htons(1025);//serveraddr.sin_addr.s_addr     = inet_addr("127.0.0.1");serveraddr.sin_addr.s_addr  = inet_addr(SERVER_IP);    //自动生成自身IP做服务器IP给客户端连接if(bind(listenfd, (struct sockaddr *)&serveraddr, sizeof(struct sockaddr_in))<0)   //绑定{perror("bind error.");return -1;}ServerDataHandle_recvform_sendto(listenfd);   //注意这里传进来的listenfd对应前面的fdreturn 0;
}

对应接收端,imx8这边的还需要按上面所说的配mk

一个是设备树的:

# -------@block_infrastructure-------
CONFIG_REPO_PATH := device/nxp
CURRENT_FILE_PATH :=  $(lastword $(MAKEFILE_LIST))
IMX_DEVICE_PATH := $(strip $(patsubst %/, %, $(dir $(CURRENT_FILE_PATH))))# -------@block_kernel_bootimg-------
# Don't enable vendor boot for Android Auto with M4 EVS for now
TARGET_USE_VENDOR_BOOT ?= false# -------@block_storage-------
# Android Auto with M4 EVS does not use dynamic partition
TARGET_USE_DYNAMIC_PARTITIONS ?= false# -------@block_infrastructure-------
include $(IMX_DEVICE_PATH)/mek_8q.mk# -------@block_common_config-------
# Overrides
PRODUCT_NAME := mek_8q_car
PRODUCT_PACKAGE_OVERLAYS += $(IMX_DEVICE_PATH)/overlay_car# -------@block_app-------
PRODUCT_COPY_FILES += \$(IMX_DEVICE_PATH)/privapp-permissions-imx.xml:$(TARGET_COPY_OUT_SYSTEM)/etc/permissions/privapp-permissions-imx.xml# Add Google prebuilt services
PRODUCT_PACKAGES += \HeadUnit \privapp_permissions_google_auto# -------@block_camera-------
# Add Car related HAL
PRODUCT_PACKAGES += \android.hardware.automotive.vehicle@2.0-service \android.automotive.sv.service@1.0-impl \sv_app# -------@block_miscellaneous-------
PRODUCT_COPY_FILES += \packages/services/Car/car_product/init/init.bootstat.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.bootstat.rc \packages/services/Car/car_product/init/init.car.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.car.rc \# ONLY devices that meet the CDD's requirements may declare these features
PRODUCT_COPY_FILES += \frameworks/native/data/etc/android.hardware.screen.landscape.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.screen.landscape.xml \frameworks/native/data/etc/android.hardware.type.automotive.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.type.automotive.xmlifeq ($(PRODUCT_IMX_CAR_M4),false)
# Simulate the vehical rpmsg register event for non m4 car image
PRODUCT_PROPERTY_OVERRIDES += \vendor.vehicle.register=1 \vendor.evs.video.ready=1
else
#open bootanimation
PRODUCT_PROPERTY_OVERRIDES += \debug.sf.nobootanimation=0
endif # PRODUCT_IMX_CAR_M4#isoftstone
PRODUCT_PACKAGES += \spidev_test \uartdev_test \RTCdev_test  \sensor_test \memtester \badblocks \SmartCockpitLauncher \ApaCamera2 \UpgradePRODUCT_COPY_FILES += \vendor/isoftstone/product/media/bootanimation.zip:$(TARGET_COPY_OUT_PRODUCT)/media/bootanimation.zip \vendor/isoftstone/idc/Vendor_1a86_Product_e2e4.idc:$(TARGET_COPY_OUT_VENDOR)/usr/idc/Vendor_1a86_Product_e2e4.idc \vendor/isoftstone/idc/Vendor_1a86_Product_e5e3.idc:$(TARGET_COPY_OUT_VENDOR)/usr/idc/Vendor_1a86_Product_e5e3.idc

还有就是对应的目录下面的mk:

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES:=imx8_time.c
LOCAL_MODULE:=RTC_test
include $(BUILD_EXECUTABLE)

注意:

接收方:
1. 先touch 1.txt 手动  如果报open错误
2. open file的方式 O_TRUNC | O_WRONLY ,如果改成仅仅O_TRUNC,1.txt里面会没东西

发送方:
3.发送字符,而不是发送结构体,循环里改成(类似的在main之前被注释掉的函数里有写):
                                memset(buf,0,1024);
        
        sprintf(buf,"%d:%d:%d\n",tm.tm_hour,tm.tm_min,tm.tm_sec);
        
        sendto(socketfd, buf, sizeof(buf), 0, NULL, 0);

这里如果不确保是发送字符而是发送结构体的话,那么不论收到的还是保存数据1.txt里面都会是乱码:

4.struct rtc_device rtc 这里如果报错应该是和rtc.h里面重复定义了

5.几个fd,  还有几个定义的fd,包括,listenfd,fd,rtcfd,file_fd不要搞混了,然后各个的判断如fd<0不要忘记写。

if(file_fd < 0)
{
 perror("open file err");
  return ;
}

发送里面这个不能忘记写,写在if(fd<0)前面

6.进去板子里跑应用程序的时候,imx8这边不要Push到/storage下面,这下面哪怕chmod 777 了也跑不了,会报permission denied,最后是去/data下面跑通的

接下来要把imx8收到的rtc时钟信息保存到自己的时间里面,目前的话,想的是通过date命令,然后看了date命令的 date --help是这样:

最后今天学到的:set nu可以显示代码的行号

imx6获取和同步时间相关推荐

  1. esp8266 at接收数据中断时间_利用ESP8266获取网络同步时间(北京时间)

    本文需要读者有一点ESP8266的基础知识,比如ESP8266的模式设置,AP连接,联网. 1. 提供网络时间的网站 要想获取网络时间首先要有提供网络时间的网站,免费提供网络时间的网站有很多, 这里以 ...

  2. 嵌入式linux 使用ntpdate命令同步时间

    前言: 网络时间协议Network Time Protocol(NTP)是一种通过网络来获取并同步时间的方法.在可以访问网络的情况下 ,只需要安装NTP的client到公共的NTP server来修正 ...

  3. 华泰股票交易接口如何获取实时数据和同步时间数据?

    下面直接分享华泰股票交易接口如何获取实时数据和同步时间数据? 首先.获取实时数据 python的函数库非常丰富,httplib具备获取API接口数据的功能. API返回参数是json格式的,可以用非标 ...

  4. linux怎么和宿主机同步时间,Linux 中设置和同步时间

    准确的系统时间是稳定服务的基础,本文介绍与时间相关的Linux命令,以及如何为自己的Linux服务器维护准确的时间. 时间 一台Linux服务器有两个时间源,一个是硬件时间,即服务器硬件CMOS维护的 ...

  5. Linux同步时间命令ntpdate

    转自:http://orgcent.com/linux-ntpdate/ 由于要同步Linux服务器的时间,为了保证时间的高度准确性,放弃date命令而转向ntpdate(同步时间命令). 方案如下: ...

  6. 计算机无法与internet同步时间,win7系统能上网可是无法同步Internet时间的解决方法...

    今天和大家分享一下win7系统能上网可是无法同步Internet时间问题的解决方法,在使用win7系统的过程中经常不知道如何去解决win7系统能上网可是无法同步Internet时间的问题,有什么好的办 ...

  7. 配置Chrony同步时间,以及ntpd,ntpupate

    参考文档: https://www.tecmint.com/install-chrony-in-centos-ubuntu-linux/ https://www.redhat.com/sysadmin ...

  8. 命令行net time同步时间(内网)

    首先还是推荐大家使用Internet时间来同步自己计算机的时间,这样做主要是方便,就是设置一个ntp服务器,我推荐下面的三个ntp服务器地址. time.asia.apple.com //亲测有效 a ...

  9. 命令行net time同步时间(内网)(转载)

    命令行net time同步时间(内网)(转) 本文转载,方便自己使用查询 出处:https://www.cnblogs.com/mq0036/p/8945653.html 首先还是推荐大家使用Inte ...

最新文章

  1. 狼的故事16:空有强壮的身体
  2. MySQL:实用 SQL 语句集合
  3. 前端学习(3193):react的容器中的错误
  4. RTX5 | 消息队列02 - 放入与取出消息
  5. tdk怎么设置_网站tdk如何正确的设置
  6. 前端入门-day2(常见css问题及解答)
  7. Codeforces Good Bye 2015 D. New Year and Ancient Prophecy 后缀数组 树状数组 dp
  8. 如何写一份优秀的投资计划书
  9. Windows安装ElasticSearch 7.3.0
  10. Policy Gradient (PG)与Proximal Policy Optimization (PPO)算法详解
  11. JAVA设计模式之备忘录模式
  12. 硕士毕业论文格式总结
  13. YUV420P、YUV420SP、NV12、NV21和RGB互相转换并存储为JPEG以及PNG图片
  14. css3夜空北斗七星闪烁动画js特效
  15. 用鸿蒙开发AI应用(六)UI篇
  16. 网络编程 TCP电子网络词库
  17. 程序猿光棍节闯关游戏
  18. 大容量邮箱如何注册?TOM VIP邮箱帮你轻松搞定
  19. 2022-2028年全球与中国固体拦截器行业发展趋势及投资战略分析
  20. 支持异构 GPU 集群的超大规模模型的高效的分布式训练框架 Whale

热门文章

  1. OCSP在线证书状态协议内容描述
  2. DOS批处理简明高级教程
  3. HTTPS双向认证+USB硬件加密锁(加密狗)配置
  4. 卸载包时不要简单的用 uninstall !!
  5. Java(1):Java SE疯狂复习基本数据类型、OOP
  6. 基于MATLAB的烟雾火灾检测识别系统
  7. 下周一直播 | 深度学习算法可视化调优实战演示
  8. iOS 小说字数统计
  9. 概率论得学习和整理6:概率的分布
  10. 迪克斯特拉(Dijkstra)算法之MATLAB实现