嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # a4 @  x$ A5 n! V4 P" ]7 \  S" p

6 D4 F6 M# c; ?% d. I' g8 j" D7 WOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>3 G1 z/ i% ~; u0 o( W$ `
#include <unistd.h>- u$ ^' U* G& _( N0 E9 V
#include <sys/mman.h>
9 b, z, Z7 n7 S3 E& e0 V9 t#include <sys/types.h>
& i5 ^% M* p/ `# P#include <fcntl.h>
. T) v8 W! a4 ]
& D* i  O$ S% j8 y#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ P! `* C; I& I

5 V2 x  U) i3 w: V  f* ]typedef struct8 n2 N, p* v) U! Q
{
: e+ Q: j: y) C  H( k4 Q' F) a        unsigned int a;" \% C9 S2 P% Z3 h& C3 v3 c3 E; k1 U
        unsigned int b;
. L7 s0 C4 y0 _% ]- Q+ l        unsigned int packet_cout;
0 r5 z4 O! Z+ \! U}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ X9 Q1 u) z' j4 f7 o6 R
* i1 V( j8 G. e) H. U" P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 D" N; z  ?0 M  }
unsigned int count_copy = 0;
2 e6 |3 f" C$ B! \/ Z( [3 N% G5 E5 k: f: k' h: Q+ w% A! r) }( d

4 d2 h+ ~# E) r  L* f: b5 }int main()
3 \2 W! [- K$ l" p8 C  @, d{/ m; M8 P% ]* t7 O- n
        pRX_MSG_PROTOCOL pshreRAM = NULL;5 ~1 i1 ]9 Q1 w* r0 e
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ K+ U2 d. A, g* l4 \6 W# d; ?8 |$ k

) j3 S! E& S( _8 J        while(1)0 A  p0 Z  L( l  v
        {" n& M( U' C3 v& E9 O5 U/ m
                read_MSG_buffer(pshreRAM);: v( T* S0 ~0 F
        }                , d* G3 w" ^# a6 w+ s7 B
}
1 L1 ^1 E5 D/ d& F) E9 p. u6 a4 w% E; Y/ f* [+ c* Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- a; k3 [! G+ H
{+ k( G# h* y7 U" G2 D& v
        RX_MSG_PROTOCOL buf;" @5 u* w- `4 k* T; X5 g
        , d" }- k: Z1 ]3 e. a- Y5 ]# x: P
        buf.a = pshreRAM->a;
- Q" l. u( o  i! I" x% A( U' ?        buf.b = pshreRAM->b;# b- g7 R$ a0 ^  D* w
        buf.packet_cout = pshreRAM->packet_cout;" t1 d# U  B# i. q
        
, v; b# I6 {; Q- L8 e        if(buf.packet_cout != count_copy)
0 M+ |/ n' s3 ]! ]$ x        {
; o+ O9 }, P; ?                printf("a is %d\n", buf.a);
* X0 n0 W/ ]; T6 W                printf("b is %d\n", buf.b);
# E0 L8 a( |3 k. l2 A$ o3 d- t                printf("count is %d\n", buf.packet_cout);5 [' j/ S0 ?1 F& k8 Y
                count_copy = buf.packet_cout;
. h* k! o6 J# ^% T7 }7 e, I- }+ U0 q        }0 B: c3 Q8 C+ R9 h- l; `& G, y
        else/ w4 I' F$ h, t; q0 T0 _
        {
. _( W! I+ A- s# B                printf("No effective message!");
1 n* k2 ^) z; \5 M/ ^7 b  S2 V2 Y        }8 b% L1 b% l; A' I
}) p0 A' ?% S6 C/ c# \9 [( y$ `

4 A3 ]9 G0 ?2 _" a# g
7 {- S4 R; A/ h2 ~% V& w( Y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 }( H1 m# Y! ?" Y9 a/ {" @# ?: u使用下面代码,对内存使用了mmap函数后:; Z/ U* g9 t% X2 |; ]% O0 R
#include <stdio.h>
, \' W+ O. q1 ~) \#include <unistd.h>. Y7 ]' ~  B+ t- E+ k$ C  @" n
#include <sys/mman.h>' Z3 r& t9 w$ r
#include <sys/types.h>
7 D3 C  }! M$ k! t2 ^* h8 X& n0 c#include <fcntl.h>. P8 Z4 a+ A5 R+ n* a
( B; C# m* K3 a$ Q5 Y
#define SHAER_RAM_BASE_ADDR    (0x80000000)' W# e) G7 O3 x% \4 |4 `3 H
#define SHAER_RAM_SIZE         (0x20000)   
" ?6 w) o. b% }1 h  X5 V8 n5 _; N$ ~2 V2 x' M/ W. Z% \0 n
typedef struct
4 h$ E1 r5 s: Q' m! R7 B8 P# y; m{1 {% Z" A& z# D+ e1 T! z
        unsigned int a;. L: P7 a) L6 q3 @5 d/ @
        unsigned int b;
6 _/ a: y3 R0 d& z6 U) H- I        unsigned int packet_cout;# y3 P. r1 K( }0 R- D  D3 t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 E5 A: f" V; @% s
  E, n- P3 |/ R0 h0 W# evoid read_MSG_buffer(int *baseaddr);/ g. |( k1 R1 C) ?% m6 B0 ~
unsigned int count_copy = 0;( q8 A/ v; ~* z2 ?7 w' w: x9 O
( M2 {. Z$ d. A7 J3 K8 `
int main()
- {0 }; i* X( _  p{# s& Y" |$ p- p, p. k1 x
        int fd;
% R. T3 e# p; K5 i: P2 {4 |        int *mem = NULL;
. T- @2 M; S, K; c# U" \2 I' `" A9 `5 \
        if((fd = open("/dev/mem", O_RDWR)) <0)
+ \8 r8 I" y4 N4 B; M! R  V/ v        {8 f$ ~5 w2 A4 g1 o5 ^" b/ J. o2 O
                perror("open error");# g7 u, K! x. f  u
                return -1;5 S$ I! C4 B, u0 H- V
        }
. @2 j9 Z( y# r8 o        8 e/ r8 n! a3 t3 B- a. v  q9 v; J; Z. W
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% M( s/ I8 M, d3 C+ T+ @2 `5 t

) A, z( k; J! h        while(1)5 v2 w% e3 w6 u" a$ p+ e: {
        {
3 {" M0 E! O3 C" m3 l                read_MSG_buffer(mem);
* t5 L9 s6 E7 \; Y) M' d7 |0 y        }                & A2 b+ B2 L' @
}7 i# P( k$ i3 p) b

/ V  K# K. X4 Y: F5 Q% I) Vvoid read_MSG_buffer(int *baseaddr)9 p3 o# q4 n* h0 ]- c( X' N* s) G6 r
{3 A4 ?# Q0 H# L) P  ~5 K
        pRX_MSG_PROTOCOL pshreRAM = NULL;- S. E- ^6 V" q' F/ \

8 t( m, j7 q, p2 h3 V0 a+ R        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, k. t. F# A2 P0 d0 v( M

; v$ w* P2 y9 Z4 X1 `        if(pshreRAM->packet_cout != count_copy)
, E" D3 y: H' R" m$ S1 J! a        {5 z6 h- {1 U, g% K/ i
                printf("a is %d\n", pshreRAM->a);. H# D% x0 d# n& o" N" I
                printf("b is %d\n", pshreRAM->b);. D; g7 K# O7 T2 C0 z7 p4 J8 K, _. G7 }
                printf("count is %d\n", pshreRAM->packet_cout);
* D- @" e$ ]5 d                count_copy = pshreRAM->packet_cout;
1 b# f+ m" Y4 k        }
4 f# C. Y, t/ P0 A        else7 ]8 {- h9 b5 d6 y5 @" y) ]: Q+ w& o
        {. A+ ^1 D% I# t; p
                printf("No effective message!\n");
: d- ~: s9 N& n1 _2 o# k        }; B/ e+ G8 _* V- P
}
6 H9 _/ D; T: I) n# J
2 u! U0 n5 t7 }0 @) R* \没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  j$ i4 b1 U' m' G) I" L2 s& `

! s0 a7 ^* W& `6 @6 t0 @, o% M" h; q- U$ Z0 V" y4 u2 P, P

, I( d7 H) s% u0 h2 Y8 R- T! A( M0 _& o) F% D# V5 A1 L





欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4