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

手把手带你搭建一个语音对话机器人:5分钟定制个人AI小助手

通过本文的简单步骤,你已经掌握了如何用 Python 搭建一个语音对话机器人。我们使用了实现语音识别,利用 OpenAI API 生成对话内容,并通过gTTS将文本转换为语音。整个流程非常简洁,你可以根据自己的需求进一步扩展机器人功能,甚至将其集成到实际的应用场景中。

小蜗牛的珍贵百宝箱 4805

从二极管到CMOS:手把手教你搭建数字电路中的基础门电路(附原理图)

本文详细介绍了数字电路中基础门电路的搭建方法,从二极管门电路到现代CMOS门电路的设计与实现。通过原理图解析和实战案例,帮助读者掌握数字电路设计的核心知识,包括电平实现、门电路工作原理及实际调试技巧,适合电子技术爱好者和初学者学习参考。

weixin_29252171的博客 320

IPC进程间通信

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

2301_80834940的博客 1270

Spring Boot 微服务 API 网关实战:Spring Cloud Gateway 整合,搞定路由转发 + 统一认证 + 限流熔断(企业级落地)

摘要:本文详细介绍了SpringCloud Gateway在微服务架构中的核心作用与实现方案。作为API网关,它解决了服务入口分散、认证冗余、流量失控等痛点,提供路由转发、统一认证、限流熔断等能力。文章通过图书管理系统案例,演示了SpringBoot整合Gateway的全流程,包括基础路由配置、JWT全局认证、局部参数校验、Sentinel限流熔断以及Nacos动态路由等核心功能实现。特别强调了企业级落地中的关键注意事项,如路由顺序、过滤器执行顺序、HTTPS配置等。该方案能有效构建统一、安全、高效的微服务

lamehsl的专栏 1381

Linux 进程间通信(IPC)详解

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

2302_81263197的博客 217

定时器(PWM输出)触发ADC采样(DMA)——STM32CubeMX

已知 Tclk 为 84MHz , 我们需要 Tout 为 200ms 即 200000us , 不妨先让PSC为 839, 带入上述公式可得 ARR = 19999. 这样算出来之后ARR和PSC都在0~65535的范围, 则可以使用这组参数。例如,如果时钟频率为1MHz,并且PSC设置为1000,则实际的定时频率将为1kHz。当重装载值(Period 或 ARR)设置为 500 时,意味着定时器需要计数 500 个时钟周期才会触发中断。例如,如果时钟频率为1MHz,则Tclk为1微秒。

2301_77123899的博客 1万+

ADS软件操作(10)——DAC控件使用

该控件可以用于为元件定义随频率变换的参数,如放大器的最佳负载阻抗或者源阻抗,需要双频匹配时的优化等,下图是ADS中该控件的模型。

Zhuanzhuyan的博客 4394

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

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

weixin_33910191的博客 324

工业相机,大恒,面振相机8脚电源线和I/O触发接口线,颜色和接法说明和触发软件设定

上图: 说明一下,工业相机有TTL逻辑电平触发,也有光耦触发等。 这里一般我们用电路板驱动,就用GPIO触发模式, 这里,准备了两个GPIO触发模式,为LINE2,LINE3都可以选择,然后有一个GPIO_GND 如果,你只有一个触发接口,那么如图,选两个就好了。 实际接法如图。 ...

山云的专栏 1万+

0513_IO7

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

slander_1120的博客 686

大模型系列——一文看懂“提示词” vs “提示词工程” vs “上下文工程”

本文区分了AI领域的三个关键概念:提示词(Prompt)、提示词工程(Prompt Engineering)和上下文工程(Context Engineering)。提示词是直接输入给AI模型的指令文本;提示词工程则是系统化设计、测试和优化提示词的过程;而上下文工程是为AI构建动态上下文,提供恰当信息和工具的科学与艺术。文章通过翻译案例展示了提示词工程的迭代过程,并说明上下文工程在AI Agent中的核心作用——动态收集和组织必要信息。最后强调普通人只需掌握提示词编写,开发AI应用才需深入提示词工程,构建智能

2401_84052244的博客 750

openpi 入门教程(二)droid libero 训练、推理

OpenPI是由物理智能团队发布的机器人领域开源模型与软件平台,提供基于流扩散式(π₀)和自回归式(π₀-FAST)两类视觉-语言-动作模型。平台支持在DROID、ALOHA、UR5等多种机器人系统上部署,包含预训练检查点(1万+小时数据)和微调示例。文档详细说明了各平台部署流程:DROID需启动策略服务器并配置摄像头;ALOHA提供真实机器人任务(取吐司、叠毛巾等)的检查点和场景设置建议;UR5示例展示自定义数据转换方法。实验性验证显示π₀-FAST在LIBERO基准测试中平均得分85.5。平台强调模型适

2506_90492529的博客 1023

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

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

weixin_34161032的博客 358

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

weixin_34209851的博客 437

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IO—消息队列+管道

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

DJQ2020391635的博客 311

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

从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、付费专栏及课程。

余额充值