OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5743|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 E) N$ Y# k/ O" a

( w9 Y- ?5 _; _; rOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. y4 Q/ h: E  S; Y9 G4 j* g#include <unistd.h>
' o1 K  }9 _& d$ I) z( U#include <sys/mman.h>
; K& `' ?6 K6 t1 k#include <sys/types.h>1 M! Q( N: @  V2 _7 l, y; e
#include <fcntl.h>$ K% f5 N( O# [! p: u) j* {" t2 m
( Z! h0 p) U5 K3 {/ L! _
#define SHAER_RAM_BASE_ADDR    (0x80000000)     Z5 U; t/ k- T( _
* k# ?7 V% Z! B% A+ q+ }1 j
typedef struct3 m7 G" Z& C2 x' @" \* G+ f8 _& l
{  q3 f* l% Z$ |! a7 \% L: \; [
        unsigned int a;4 I9 n. z9 i+ p& [* g" L
        unsigned int b;
7 B: G% E6 G  ^5 U# |( G        unsigned int packet_cout;) ~4 f' P% ~( P2 B) x) M
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" Y: P  b4 v# A1 a

, f! k  f- r7 f; ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# h7 S" ~/ F) y8 funsigned int count_copy = 0;
, \8 x4 M& Q' \+ n9 f: @6 B1 \5 S+ T3 Z& A- Q, `4 k( v- o6 l

9 |9 [! _9 `' [  j2 {8 e/ Iint main(). ^( l7 V; s& v" H# ~9 S  W0 ]* z9 E- n. X
{1 {& i7 S# e# r- k- P, f6 M
        pRX_MSG_PROTOCOL pshreRAM = NULL;
) a3 ^* t3 n8 K. U' w        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 C; M* R$ \7 F' g6 s
: M6 }# W3 R$ i. e5 T0 p; s        while(1)5 [2 Y" c  ]7 _! P
        {
! x  K1 `# `( N1 M                read_MSG_buffer(pshreRAM);
' k4 n# S  f. d& [) t' C& w8 p        }               
$ C# u3 h4 ^) \+ k- ]}
3 W. D- U5 ]( a2 [5 N  J
3 d3 }0 i8 z' uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- s( A4 v6 g  d0 _% q8 N
{
% c& c+ u* d; m# \" X0 g* D4 w        RX_MSG_PROTOCOL buf;; R9 `5 ]. A0 _7 k7 P! z
        
) D2 g* h2 R3 m" U7 v/ K! E& n$ ^        buf.a = pshreRAM->a;
) Q: J8 Y& U- F% M        buf.b = pshreRAM->b;9 {2 P. C- e# ~% A+ B; w
        buf.packet_cout = pshreRAM->packet_cout;
. y) J# J2 G7 w: i% A- h- C3 V        9 V# M# N/ X- c: o! G( G
        if(buf.packet_cout != count_copy)- g' Z; ^. y2 E* z: |5 [
        {: l- d  v3 r% S$ @  z
                printf("a is %d\n", buf.a);" T' S/ U' q! i1 h+ X& Q
                printf("b is %d\n", buf.b);
/ X/ R' A9 o9 `, y! m! V% K$ C                printf("count is %d\n", buf.packet_cout);; b  |9 r- x/ d- `0 a
                count_copy = buf.packet_cout;  Y, I! w: a( ~7 z- `% Q% D
        }
& {. W: A5 A6 R+ Q7 ^# D) E        else
# F2 C+ M. M- r+ W9 _( h( H        {7 q) y' `0 q6 \
                printf("No effective message!");; E1 j: L4 Y/ o& \7 K, o5 _
        }
+ d( q) D& Y( Q( p}
% \, T: Y# Y" }6 u, T% j% t* t( o6 c' ]) x* c$ B. P5 `- W4 A+ e

2 \  X/ h8 p/ F! d6 L) b但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ t0 t% a( J: w+ h8 f, r3 R9 w使用下面代码,对内存使用了mmap函数后:" m. g" ]) \: q  N4 [9 B$ h6 Q+ H
#include <stdio.h>. B* N+ x* x* L8 m
#include <unistd.h>( f- x6 K0 v. d6 e* I3 e: f4 W
#include <sys/mman.h>3 P: t+ F* M6 G" o, v4 J" P
#include <sys/types.h>0 I/ b8 h& Z- t$ Y. q1 s
#include <fcntl.h>7 e; o5 \& u3 d2 @, v# R6 q: z
* p! y1 T( q3 [4 z
#define SHAER_RAM_BASE_ADDR    (0x80000000)# _: g# K2 e9 N
#define SHAER_RAM_SIZE         (0x20000)   3 \0 K5 m  e  p6 S3 @* ^( P- ~
: v: o" I6 n, ]; u9 ^! V5 A* k  [
typedef struct& h# H; i9 v2 E! {' L. ^
{
8 d9 ?4 i+ X. ^! H) i) C* [/ _7 j        unsigned int a;
/ Q% D2 K0 D0 D& G        unsigned int b;
4 g/ Q2 x! f: r( Q2 j        unsigned int packet_cout;9 {- o2 A8 C, T) i$ S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% L- M) e* |9 R6 c
2 ^1 t' u+ k3 F" H% ?7 mvoid read_MSG_buffer(int *baseaddr);
; ?) P9 `  W; \( }9 Uunsigned int count_copy = 0;0 b7 ~/ \, k0 v2 X2 a7 r
! \# f& G8 P6 S9 ^4 [; {4 K
int main()2 e+ j3 e# [( ^
{: W8 w6 T+ N; V1 `1 F/ |' B0 t
        int fd;
7 F  }' f) n/ e        int *mem = NULL;. f% Z& l; z; [; |
- l, B" \1 e4 @+ w' g6 o
        if((fd = open("/dev/mem", O_RDWR)) <0)- Y5 k; _' t& g6 t5 @$ M
        {# w1 Y6 M1 ?( T; q
                perror("open error");
' s: N( l" K7 M: m                return -1;
' J/ Y: T% U- A0 I4 s) d3 \# G5 d        }
2 F0 U$ q, F+ e. `        
' H: F% f3 N$ i+ q0 M3 }) A8 u        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 u6 @0 }2 p% h7 `; S5 g
8 q3 r" K" k, h( B. ?8 v, z        while(1)
- R# v5 L. H+ J' A4 g        {
* j6 L- i- e; D  h7 D  f; r                read_MSG_buffer(mem);
" r( e% z$ S4 ]& V4 f5 Y, `# \6 t) `        }               
/ s2 i" s& T1 C}
. ]9 t4 F( W# |( V. ]% A
: m: s+ h: e/ kvoid read_MSG_buffer(int *baseaddr)# C& {& h; K% X  S9 j, |* \
{, \; ?' }/ Q7 [; p* |
        pRX_MSG_PROTOCOL pshreRAM = NULL;
& T1 C1 u. D. j0 O" N% ^, {
, |1 ]+ E$ [# `6 j        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 i' N$ P+ a# [$ w9 N& X7 Y

0 u+ E8 e$ v3 a. m% l% C        if(pshreRAM->packet_cout != count_copy)( c2 d9 C+ {* q+ V6 q
        {: Y% g& ^6 `4 }2 Y
                printf("a is %d\n", pshreRAM->a);3 h/ c. [& R$ c: {' z" j) n
                printf("b is %d\n", pshreRAM->b);1 n7 H$ x: l- W
                printf("count is %d\n", pshreRAM->packet_cout);; n, j. G$ P! t6 S; ^# n# q) v
                count_copy = pshreRAM->packet_cout;
& C8 A3 Y% Y4 q' j( H        }
' m; u( e' j3 h; W" p5 E        else9 F) R, _/ u9 |8 C! z
        {/ D0 N' e/ l1 e3 \8 @7 v4 h) b
                printf("No effective message!\n");
+ U% P0 K/ d/ q7 R        }* \) w+ b( j: G
}$ I8 ]% L! e  ^% E( ]

! \( j. e6 ?1 J4 \5 u0 ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( J. d) `+ e4 R
0 W0 W% Y1 ~& a- v- Z2 G/ U. R

& e* U( `7 h; J" Z; m- }, ^3 i5 ~9 }

( X, J0 B2 K! b! J/ ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-2-17 15:25 , Processed in 0.042036 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表