首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于嵌入式Linux的移动机器人控制系统

基于嵌入式Linux的移动机器人控制系统

关键字:嵌入式Linux   多任务   共享内存   语音控制   模糊控制  
2.2 进程间通信机制

在信息处理进程中,需要对不同任务返回的有效数据进行信息处理和融合。由于不同进程的数据段、堆栈段是相互隔离的,因此,采用共享内存的进程间通信方式,在程序中可以使用shmget从系统中取出一块未使用的物理内存并映射到用户空间,如图3所示。



图3 共享内存机制示意图



在两个进程之间建立共享内存的具体实现步骤如下:

① 在调用fock()前,使用shmget创建新的共享内存,返回值为共享内存标识码:

shmid = shmget(IPC_PRIVATE,1,PERM)

//申请一个字节共享内存

② 调用fock()函数,创建子进程,根据fock()的返回值区分父进程和子进程,并分别在两个进程中使用shmat映射一块共享内存,即允许当前进程访问创建的共享内存:

if(fock()) p_addr= shmat(shmid,0,0);

//将共享内存映射到父进程

else{c_addr=shmat(shmid,0,0);}//将共享内存映射到子进程

其中,shmid为shmget()函数的返回值,即共享内存标识码。

从用户的角度看,在父进程中可以对p_addr进行读写操作,实际访问的是申请的共享内存。子进程则可以对c_addr进行读写,从而实现两个进程间的通信。共享内存的映射和进程之间的关系,如图4所示。



图4 进程和共享内存映射关系



2.3 系统控制流程

在程序初始化完成后,为每项任务创建了相应的进程,并建立了共享内存,如图5所示。在每个进程中采用循环执行方式,语音识别进程中利用select函数监控是否有识别结果输出,并将识别结果写入到相应的共享内存区。



图5 系统控制流程图



航向测量和计算进程循环读取陀螺仪的角度信息并存储。超声波测距进程在接收到信息处理进程的控制命令后进行测距并将数据返回至信息处理进程。信息处理进程融合了多传感器的数据,根据设定的路径规划方案,将控制信息传输到电机控制进程,实现机器人姿态的调整。
返回列表