IO IPC练习 (CTRL+C功能待完成)

深入解析AM335x IPC与DDR寄存器:从硬件原理到嵌入式系统优化实战 在嵌入式系统开发中,内存映射I/O和寄存器编程是直接与硬件交互的核心技术。其原理在于CPU通过特定的物理地址访问和控制硬件寄存器,实现对底层硬件的精细化管理。这项技术的价值在于能够突破标准驱动库的限制,直接优化系统性能与稳定性。在基于AM335x等复杂SoC的应用场景里,掌握处理器间通信和内存接口的寄存器配置尤为关键。例如,通过配置IPC寄存器,可以构建高效低延迟的核间通信机制,替代效率较低的软件队列;而精细调整DDR I/O控制寄存器中的阻抗与压摆率参数,则能从根本上提升内存信号完整性,解决系统稳定性问题 阅读详情

使用消息队列实现的2个终端之间的互相聊天
并使用信号控制消息队列的读取方式:
    当键盘按ctrl+c的时候,切换消息读取方式,一般情况为读取指定编号的消息,按ctrl+c之后,指定的编号不读取,读取其他所有编号的消息

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/wait.h>
#include <pthread.h>
#include <sys/ipc.h>
#include <sys/msg.h>

//发送端

struct msgbuf{
	long type;
	char buf[128];
};
void* run(void* arg) //子线程接收端
{
	key_t key = ftok("./ipc",1);
	if(-1 == key)
	{
		perror("ftok");
		//return 1;
	}
	//int msgtype = atoi(argv[1]);
	int msgtype = 2;
	printf("请输入msgtype,默认为2:");
	scanf("%d",&msgtype);
	getchar();
	int id = msgget(key,IPC_CREAT | 0666);

	if(-1 == id)
	{
		perror("msgget");
	//	return 1;
	}
	struct msgbuf msg;
	int size = 0;
	while(1)
	{
		memset(&msg,0,sizeof(msg));
		msgrcv(id,&msg,128,msgtype,0);
		printf("读取到的数据为:%s\n",msg.buf);
	}
}

int main(int argc, const char *argv[])
{
	pthread_t tid;
	
	if(pthread_create(&tid,0,run,0) != 0) //开启线程
	{
		perror("pthread_create");
		return 1;
	}
	if (argc != 2)
	{
		printf("参数错误\n");
		return 1;
	}
	int msgtype = atoi(argv[1]);
	//第一步,获取密钥
	key_t key = ftok("./ipc",1);//根据文件名和编号,生成一个密钥
	if(-1 == key)
	{
		perror("ftok");
		return 1;
	}
	//根据密钥创建/访问消息队列
	int id = msgget(key,IPC_CREAT | 0666);//根据密钥,返回消息队列的编号
	if (-1 == id)
	{
		perror("msgget");
		return 1;
	}
	struct msgbuf msg;
	int size = 0;

	while(1)
	{
		memset(&msg,0,sizeof(msg));//先将结构体清零
		msg.type = msgtype; //确认消息编号
		printf("请输入:");
		scanf("%128s",msg.buf);
		while(getchar() != 10);
		size = strlen(msg.buf);
		msgsnd(id,&msg,size,0);//将消息写入编号id的消息队列中,
							   //想要发送的消息的地址
							   //真正消息大小,不包含前8个字节
							   //无视消息编号,发送物理意义第一条消息
	}
	return 0;
}
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/wait.h>
#include <pthread.h>
#include <sys/ipc.h>
#include <sys/msg.h>

//接收端

struct msgbuf{
	long type;
	char buf[128];
};

void* run(void* arg) //子线程发送
{
	key_t key = ftok("./ipc",1);
	if(-1 == key){
		perror("ftok");
		//return 1
	}
	int msgtype = 2;
	printf("请输入msgtype,没有默认为2");
	scanf("%d",&msgtype);
	getchar();
	
	int id = msgget(key,IPC_CREAT | 0666);
	if(-1 == id)
	{
		perror("msgget");
		//return 1;
	}
	struct msgbuf msg;
	int size = 0;
	while(1)
	{
		memset(&msg,0,sizeof(msg));
		msg.type = msgtype;
		printf("请输入:");
		scanf("%128s",msg.buf);
		while(getchar() != 10);
		size = strlen(msg.buf);
		msgsnd(id,&msg,size,0);
	}
}

int main(int argc, const char *argv[])
{
	pthread_t tid;
	if(pthread_create(&tid,0,run,0) != 0)
	{
		perror("pthread_create");
		return 1;
	}

	key_t key = ftok("./ipc",1);//根据./目录的ipc文件和编号1确定一个密钥key
	if(-1 == key)
	{
		perror("ftok");
		return 1;
	}
	int msgtype = atoi(argv[1]);//将参数argv[1]强制转换成int形

	int id = msgget(key,IPC_CREAT | 0666);//根据密钥key,返回消息队列的编号id,
										  //如果消息队列不存在,则以0666的权限去创建
	if(-1 == id)
	{
		perror("msgget");
		return 1;
	}

	struct msgbuf msg;
	int size = 0;
	while(1)
	{
		memset(&msg,0,sizeof(msg));
		msgrcv(id,&msg,128,msgtype,0);//消息队列描述符
										   //结构体地址
										   //不包含8个头字节的最大尺寸
										   //用来指定读取消息队列,哪个编号的队列
										   //传0,表示以阻塞形式读取消息
		printf("读取的数据为:%s\n",msg.buf);
	}




	return 0;
}

随堂笔记 - Linux嵌入式ARM开发教程 - IPC 每一种通信方式都是基于文件IO的思想。 进程、线程 进程间通信 无名管道 ps命令 ps -aux 用来用来列出系统中当前运行的进程。 如果想要动态的显示进程信息,就可以使用top命令。 open函数可以打开或创建一个文件。 int open(const char *pathname, int flags, mode_t mode); 不能创建特殊文件 fork()函数通过系统调用创建一个与原来... 阅读详情

相关推荐

深入解析进程间通信:从IPC原理到工业应用实战

进程间通信是操作系统与分布式系统的核心基础,它定义了不同进程间交换数据与协调工作的机制。其原理在于通过共享内存、消息传递或信号等内核提供的原语,绕过低效的网络协议栈,实现本地进程间的直接数据交换。这项技术的核心价值在于为高性能计算、实时系统及模块化应用提供了无可替代的低延迟、高吞吐量通信能力,尤其适用于图形渲染、数据库缓存、工业控制等对性能与确定性要求极高的场景。本文聚焦于IPC 7077等工业协议及共享内存等关键技术,通过分析典型错误如ipc connection error,系统阐述在Linux/Uni

weixin_33700350的博客 340

深入解析AM275x WKUP_CTRL_MMR:唤醒控制与低功耗管理实战

在嵌入式系统开发中,电源管理是平衡性能与功耗的核心技术,尤其在汽车电子和工业控制等对实时性与能效要求严苛的领域。其基本原理是通过精细控制芯片内部不同电源域的供电状态,使系统能在空闲时进入低功耗模式,并在特定事件触发时快速唤醒恢复运行。这项技术的核心价值在于显著延长电池供电设备的续航时间,并降低系统散热与运行成本。实现这一目标的关键在于对唤醒源、电源状态转换序列以及相关控制寄存器的精准配置。本文聚焦于德州仪器AM275x系列信号处理器中的WKUP_CTRL_MMR(唤醒控制内存映射寄存器组),通过剖析其寄存器

agcozdwdfvds08078的博客 453

进程间通信(IPC)机制全解析:从管道到共享内存的实战指南

进程间通信是操作系统与分布式系统的基础概念,它解决了独立进程间的数据交换与协同工作问题。其核心原理在于通过操作系统提供的多种机制,在不同进程的独立地址空间之间建立安全可控的数据通道。这一技术的工程价值在于能够构建模块化、高内聚低耦合的软件系统,提升系统的稳定性与可扩展性。在实际应用场景中,无论是桌面应用的多模块协作、微服务架构的服务间调用,还是大数据处理流水线,都离不开高效的IPC设计。本文聚焦于**共享内存**和**消息队列**等关键机制,深入探讨它们在不同场景下的性能表现与实现细节,为开发者提供从原理到

weixin_30326515的博客 396

【Linux】Ctrl+C 到底做了什么?从键盘、kill 到 alarm,一次讲清信号的产生

本文从 Ctrl+C 入手,围绕 Linux 信号的产生展开,介绍 signal、kill、raise、abort、前后台进程、SIGKILL、SIGPIPE、alarm 等内容,并结合除 0、野指针、定时任务等实验,理解信号从产生到被进程记录的完整过程。

2402_87731470的博客 1699

SigFit实战:从FEA到光学仿真的热力耦合分析全流程解析

在光机系统与芯片封装等精密工程领域,热与力的耦合效应是影响产品性能与可靠性的核心物理问题。有限元分析(FEA)是预测结构在热、力载荷下变形与应力的基础工具,但其结果通常无法直接用于评估光学性能。这需要一座桥梁,将物理场数据转化为光学设计语言。其核心原理在于数据映射与面形表征技术,例如通过泽尼克多项式拟合,将离散的节点位移分解为离焦、像散等标准光学像差。这项技术的工程价值在于,它实现了多物理场仿真的闭环,使工程师能在设计阶段精准预测热变形或应力对波前误差、调制传递函数等关键光学指标的影响。其典型应用场景包括高

weixin_28630185的博客 338

Quantum Espresso Hands-On实战训练(四)——PDOS计算与轨道分析

本文详细介绍了Quantum Espresso中PDOS计算与轨道分析的实战方法,重点解析了PDOS在材料电子结构研究中的核心价值,包括原子级分辨率、轨道级解析和自旋极化分析。通过具体案例和操作步骤,帮助读者掌握从输入文件准备到结果解读的全流程,并提供了高级分析技巧和疑难问题解决方案。

weixin_29211309的博客 504

IPC进程间通信

信号量:本质上是维护一个value值,是一个整数,有进程申请信号号量资源时,如果该信号量资源大于0,则进行递减操作,如果当前信号量的值为0,则申请资源的进程处于阻塞状态,直到另一个进程的value值增加到大于0当有进程对该信号量进行释放操作时,该value值会递增。参数1:一个文件路径,要求是已经存在的文件路径,提供了key值3字节的内容,其中,文件的设备号占1字节,文件的inode号占2字节。参数1:key值,该值可以 是IPC_PRIVATE,也可以是fork创建出来的,前者只用于亲缘进程间的通信。

2301_80834940的博客 1270

LPDDR5 学习笔记01:功能概述

LPDDR5/LPDDR5X SDRAM设备采用8/16DQ通道架构,支持2Gb-32Gb容量。通过CK命令时钟和更快的WCK数据时钟协同工作,7个CA引脚传输控制信息,支持2:1或4:1的WCK:CK比例。设备提供BG/8B/16B三种存储模式选择,分别支持不同数据速率(最高8.533Gbps)和突发长度。采用0.5V VDDQ电源电压,实现高速双倍数据速率传输,并通过差分WCK时钟完成数据采样。读写采用突发访问机制,需先激活命令再执行读写操作。新型LPDDR5X仅支持BG和16B模式,优化了高速性能。

一只豌豆象的博客 2200

Linux 进程间通信(IPC)详解

信号是内核层与应用层通信的一种机制。缺省:按照默认方式处理信号。忽略:不处理信号。捕捉:按照指定的方式处理信号。

2302_81263197的博客 217

Zemax与Matlab交互:双胶合优化详细流程

Zemax与Matlab交互:双胶合优化详细流程

weixin_72050316的博客 629

C++实现复制粘贴文本功能

要实现这个功能,我们需要使用操作系统提供的函数来操作剪贴板。在Windows操作系统中,我们可以使用Windows API函数来访问剪贴板。总结起来,使用C++实现复制和粘贴文本功能涉及使用操作系统提供的API函数来操作剪贴板。在本篇文章中,我将向您展示如何使用C++编程语言实现复制和粘贴文本的功能。我们将使用操作系统提供的API来进行剪贴板操作,并编写相应的代码来完成这个任务。如果您使用的是Linux操作系统,您需要使用适当的库和函数来访问剪贴板。函数中,我们首先将一个字符串复制到剪贴板中,然后使用。

PixelDyno的博客 1233

AM335x IPC与DDR寄存器配置:嵌入式系统底层开发实战指南

在嵌入式系统开发中,寄存器是CPU与硬件外设进行通信的核心接口,其本质是通过读写特定内存地址来控制硬件行为。理解寄存器的工作原理,关键在于掌握位域操作和内存映射访问技术,这是实现精准硬件控制的基础。这项技术的核心价值在于,它赋予开发者对系统最底层的控制能力,能够优化性能、确保稳定性并实现特定功能。其应用场景广泛,从工业控制、物联网网关到消费电子,凡是涉及与特定硬件外设交互的领域都离不开寄存器编程。本文聚焦于TI AM335x SoC,深入剖析其控制模块中两个关键部分:用于实现**处理器间通信(IPC)**

weixin_33910191的博客 324

基于深度学习的道路裂缝检测系统完整教程

本文介绍了一种基于深度学习的道路裂缝检测系统完整解决方案。项目采用5466张高质量道路裂缝图像数据集,包含YOLO和Pascal VOC两种标注格式,覆盖多种道路场景。系统利用CNN和YOLO算法实现高效检测,相比传统人工巡检显著提升效率和准确性。文中详细阐述了数据集结构、环境配置和训练流程,包括数据预处理、智能分割策略和质量检查方法。该技术可及时发现道路裂缝隐患,降低维护成本,保障交通安全,为道路养护提供智能化解决方案。

FJN110的博客 297

0513_IO7

使用消息队列实现的2个终端之间的互相聊天 并使用信号控制消息队列的读取方式: 当键盘按ctrl+c的时候,切换消息读取方式,一般情况为读取指定编号的消息,按ctrl+c之后,指定的编号不读取,读取其他所有编号的消息。

slander_1120的博客 686

《大数据: Hive 交互命令和常用配置》

一、Hive 交互命令 1. 首先解决一个可能发生的问题 (log4 jar包冲突) 我这里解决方法就是删除一个,我删的是hive下的包 yexiang@hadoop1:<hive>$ hive SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/opt/soft/apache-hive-2.3.7-bin/lib/log4j-slf4j-impl-2.6.2.ja.

yexiang优快云的专栏 288

手把手教你学Simulink--使用Simulink进行双冗余电机驱动系统的故障切换验证

提高系统可靠性:当一个电机或其驱动器出现故障时,另一个可以立即接管,避免系统停机。增强安全性:对于一些关键任务的应用场景(如飞行控制),确保即使在硬件故障情况下也能维持基本操作能力。简化维护:允许在不影响系统正常工作的情况下进行维护和更换故障部件。确定可能发生的故障类型(如过流、欠压、温度过高),以及每种故障对应的条件。通过上述步骤,我们简要介绍了如何基于Simulink实现双冗余电机驱动系统的故障切换验证。

MHD0815的博客 438

AM275x电源管理实战:WKUP_CTRL_MMR寄存器详解与低功耗设计

在嵌入式系统开发中,电源管理是优化功耗、延长电池寿命的核心技术。其原理在于通过精细控制芯片内部各模块的供电与时钟,在满足性能需求的前提下实现动态能耗调节。这项技术的价值在于为物联网设备、便携式仪器等对功耗敏感的应用提供了关键的能效保障。应用场景广泛覆盖智能传感器、工业网关和边缘计算设备。本文聚焦于德州仪器AM275x系列信号处理器的唤醒控制内存映射寄存器(WKUP_CTRL_MMR),深入解析其IO隔离控制、时钟门控、唤醒源管理等关键功能。通过剖析寄存器位域含义与联动机制,并结合实际低功耗驱动开发中的状态轮

weixin_34161032的博客 358

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

进程通信与信号:从原理到实践,一图掌握IPC核心机制

进程通信(IPC)是操作系统和并发编程的基石,它解决了进程间数据交换、资源共享和事件通知等核心问题。其基本原理在于,由于进程拥有独立的地址空间,无法直接访问彼此数据,因此需要操作系统提供内核中介或内存映射等机制来实现通信。从管道、消息队列到共享内存,不同IPC机制在通信效率、同步需求和进程关系上各有侧重,共同构成了一个完整的技术光谱。理解这些机制的设计初衷与底层关联,对于构建高性能、健壮的分布式系统或并发应用具有关键价值。在实际的工程实践中,例如高并发服务器或分布式计算场景,开发者需要根据数据量、延迟和同步

weixin_34209851的博客 437

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IO—消息队列+管道

当键盘按ctrl+c的时候,切换消息读取方式,一般情况为读取指定编号的消息,按ctr1+c之后,指定的编号不读取,读取其他所有编号的消息。使用消息队列实现的2个终端之间的互相聊天。

DJQ2020391635的博客 311

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

从Ctrl C+V到消息队列:揭秘系统剪贴板的进程间通信原理与应用

进程间通信(IPC)是操作系统实现不同应用间数据交换的核心机制,其原理在于通过共享内存、消息传递等方式,实现进程的解耦与协作。在技术价值上,IPC解决了应用隔离与数据共享的矛盾,是构建复杂软件系统的基石。其典型应用场景包括系统剪贴板、数据库连接池以及分布式系统的服务调用。以系统剪贴板为例,它本质上是一个异步、解耦的微型消息队列,生产者(源应用)将数据以多种格式(如CF_TEXT、CF_HTML)投递到由操作系统管理的共享存储区,消费者(目标应用)则根据自身能力协商并拉取合适格式的数据。这种基于消息队列的抽象

dengjuanshou7445的博客 376

IO作业5/13

使用消息队列实现的2个终端之间的互相聊天 并使用信号控制消息队列的读取方式: 当键盘按ctrl+c的时候,切换消息读取方式,一般情况为读取指定编号的消息,按ctrl+c之后,指定的编号不读取。

jihnbjkn的博客 173

Linux编程-IPC通信之sig信号与systemV共享内存

信号是,内核作为中间人,给进程发送一个整型编号(SIGUSR1、SIGUSR2 常用自定义信号),Linux 中一种,内核发给进程的简短通知,告知进程发生了某个事件。

2401_82879595的博客 350

AM275x唤醒控制寄存器WKUP_CTRL_MMR配置与低功耗调试实战

在嵌入式系统开发中,电源管理是平衡系统功耗与实时响应的核心技术。其原理是通过精细控制处理器各功能模块的供电状态,实现从活跃模式到多种休眠模式的切换,从而在满足功能需求的前提下大幅降低能耗。这项技术的核心价值在于为电池供电或对功耗敏感的物联网、汽车电子及工业控制设备提供长续航与高可靠性保障。典型的应用场景包括需要周期性唤醒的数据采集终端、车载远程信息处理单元以及智能传感器网络节点。本文聚焦于TI AM275x系列信号处理器的唤醒控制内存映射寄存器(WKUP_CTRL_MMR)模块,深入解析其如何作为硬件底层枢

weixin_34267123的博客 385

基于IPC-2141公式计算微带线宽度

最近在折腾K7+6678信号处理板的设计,踩了不少坑也积累了些经验。这板子主打高速信号处理,核心是FPGA+DSP架构,方案选型时特别纠结时钟树和高速接口的设计。原理图上最头疼的是JESD204B接口的匹配电路——当时对着协议文档画了十几个版本,最后用Python写了个自动计算阻抗的脚本才搞定。这段脚本帮我快速验证不同板材的走线参数,特别是当需要同时满足阻抗控制和EMC要求时,比手动计算靠谱多了。实际布板时发现,理论值和实测总会有偏差,后来在关键信号线旁边加了π型匹配网络才算稳定。

ghxufMuht的博客 316

desigma渲染引擎深度剖析:tiny-skia确定性渲染、空间索引与瓦片缓存原理

desigma 是一款用 Rust 编写的免费开源 Figma 替代工具。它的渲染引擎由三部分构成:基于 tiny-skia 的确定性 CPU 渲染器 [desigma-render](https://link.gitcode.com/i/f0849ae20c542da00d807e1e2a260b5f)、按页缓存的**空间索引**(SceneIndex),以及并行工作的 **256px 瓦片缓存

gitblog_01424的博客 1049
上一篇: IO 练习 5.11作业
下一篇: 网络编程 day1 练习
风铃响了
博客等级 码龄4年 76粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值