嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 H& n$ M& K- ]# c( u6 S" V* t8 M7 ]- \3 I3 u
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! N3 V8 l5 s& o- P0 @+ @
#include <unistd.h>$ q( a7 o! F+ g- ^2 y* }/ d
#include <sys/mman.h>
9 }) u2 x! @# a! }" O+ Q- D#include <sys/types.h>
" q; `3 F: @4 @. ]# M#include <fcntl.h>& v4 T# l4 @. g8 D& |; ]( k
: G# P9 I" |4 F( Z8 V* L# _
#define SHAER_RAM_BASE_ADDR    (0x80000000)   1 L- g9 {: N3 ^  S/ {3 T

" I+ E: K1 Q$ U( B: b/ v: vtypedef struct
6 r8 B; G4 F1 ]) C6 s, ^{
6 w9 \, M2 C, _) d- |        unsigned int a;
2 J! `8 {4 Z& _+ V2 n) @        unsigned int b;
  o3 D% D$ g& B; Y        unsigned int packet_cout;- v4 d& o3 f7 F! ]0 {" ?+ Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% L* t7 l' ^' F! N

) M* _# m4 D6 O! [5 fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. z6 ^' p# J3 l2 N
unsigned int count_copy = 0;3 I+ @4 A9 c5 \8 S6 ?/ B6 h

  Y2 v* F4 e) ~& ?3 O" w: n
0 l3 W: Z  D# \! S  u8 yint main()
3 L7 h% `7 ~6 U( a; |3 N{8 L4 N) v3 V" N& c8 h& J: Y
        pRX_MSG_PROTOCOL pshreRAM = NULL;0 l/ Z5 p- i6 y4 v
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, s1 w) R3 F  G; l# c  q+ ^+ ?( N& }2 V* E! |
        while(1)% h) P$ y- z' b7 E
        {
( z# b) N( Z& z6 r                read_MSG_buffer(pshreRAM);
1 J: v+ i9 j$ i7 J4 z* ]        }                4 y6 r9 l( i9 B9 r
}
/ {0 N7 W$ \: C8 E; I3 T. G4 X: S, w9 l2 }( k7 D6 W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ d/ Y3 H4 @: E, G% Q/ b: i# E{4 G) }" R7 I" Z* [1 i) g
        RX_MSG_PROTOCOL buf;
# ?6 [- l; d. z3 n' ]+ d          ?  X# |9 A5 w
        buf.a = pshreRAM->a;. l- a* n, D" i- D  s
        buf.b = pshreRAM->b;
8 H2 I- ?: x9 E8 m! X        buf.packet_cout = pshreRAM->packet_cout;3 \* |) G, S1 X
        
2 h$ U" k: d$ V6 ^: V9 Y        if(buf.packet_cout != count_copy)1 ^! U7 `( Z3 G; E3 g( ]' A
        {
6 }4 b& z: A' a, p6 `2 w                printf("a is %d\n", buf.a);
) a) Y) A/ f! S/ m- ?8 V# ]                printf("b is %d\n", buf.b);
% p+ p! }9 w5 f1 c$ i% z                printf("count is %d\n", buf.packet_cout);
2 z) L1 Z! d" y                count_copy = buf.packet_cout;
. f' _1 H6 z- l1 A% e* y' `        }5 S3 W* {. l( P0 F3 _& j
        else
; ^: H2 T' X3 g7 \3 l) |1 v6 c1 j# p        {' ]- l- X# t+ E2 m( ?
                printf("No effective message!");8 ]' T8 e' b( }. S( i) c$ W7 L  i
        }
# k4 v6 m, l, f& F3 Z}
3 m6 i3 ?7 X, E
( L0 ^$ Z+ \' [
' L+ a' o$ _' w& n4 |但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 M- s, D; s% p使用下面代码,对内存使用了mmap函数后:
$ T' f% N6 p4 ?* n9 \5 J9 P$ q#include <stdio.h>
$ W) b7 c& {, O3 r#include <unistd.h>
0 d5 U1 a, g( A$ N#include <sys/mman.h>
3 x7 y. A8 }+ R: f; V0 Q( }, Q, r#include <sys/types.h>% e, y- t3 G0 |5 Z4 ^' v3 S" @
#include <fcntl.h>8 T/ b7 n3 X- B3 ~0 n

( e" j& Z: B$ i# J# W0 I#define SHAER_RAM_BASE_ADDR    (0x80000000)# z, K, i4 _! V$ O3 r  C* z/ [
#define SHAER_RAM_SIZE         (0x20000)   
/ W- Q" u* X$ r9 @: d; p! }7 Z7 {. S* p. v: F( O9 V% G# M* s8 B; G
typedef struct
' Z) v, H; s5 Y! u{
5 R* W1 r% j# ^& t/ ]0 h& ]        unsigned int a;
9 G2 _: h8 s0 L$ R        unsigned int b;
. X8 Q+ Q9 ^6 _% N! h        unsigned int packet_cout;$ ^% d. s* D/ a, L- a# Q: Z/ U3 V/ ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* [) l+ }5 w. t% E* J
+ R  n  V' q$ H* ~) F- yvoid read_MSG_buffer(int *baseaddr);
7 Q0 I2 r- _% q2 S6 }2 T1 Nunsigned int count_copy = 0;
. I, O$ w2 P8 z2 G% o/ e) s
( h& {* v3 n8 {  U2 K2 e* p3 Iint main()% w8 Z; k  J9 B/ V9 J4 m
{4 I& a. @. [9 _, @1 C4 C9 v. G* P# Y
        int fd;
6 V% X6 r' K' [* i0 W9 o4 a        int *mem = NULL;9 L& E( e" g2 I1 y
3 z" x- d* g. ~  P; t% c, b
        if((fd = open("/dev/mem", O_RDWR)) <0)2 Q; I+ z  b  y) d
        {
: V* I; O$ k% ?                perror("open error");0 C% M& V5 P, J( w
                return -1;
8 j- c1 k8 _  K$ s" f3 T' c- }        }6 h4 d0 W) {$ Y3 U
        
4 i$ Q0 Z1 q0 J+ Y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 D) f+ g+ A) I; w8 Y( B6 U8 Z2 f' H. y& n% D0 W
        while(1)2 ?; C9 X9 `7 C5 J$ L9 M. d
        {5 X0 Z0 n! F: ^) l6 p
                read_MSG_buffer(mem);' j" J& N& W, W# M9 [# c
        }                . t3 q2 I7 \1 D0 Y+ m: z
}
# i& v, C: w* `1 t( J/ U( Z2 j& g  L7 k0 o
void read_MSG_buffer(int *baseaddr)
2 k; Z5 d- G; [' x{. O  f; ~7 T5 ]2 G  v
        pRX_MSG_PROTOCOL pshreRAM = NULL;
- B& r3 U' C  \/ t
$ t# U& f! {+ D9 A        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 r/ z" j$ }* V/ y% c
$ }+ ~1 }6 z; l+ h! H# z. w2 m6 f
        if(pshreRAM->packet_cout != count_copy)/ [. W# @) P% L- V) c% ]
        {) ?0 P" e2 ], R7 C2 l
                printf("a is %d\n", pshreRAM->a);
- P! V5 A; X0 _& j& {                printf("b is %d\n", pshreRAM->b);3 w7 x. M1 _6 H
                printf("count is %d\n", pshreRAM->packet_cout);5 B6 h! X  ]0 e
                count_copy = pshreRAM->packet_cout;. X* F  [: r. J  D# y! n# F1 H
        }
( g# b* U) P( K' g2 S4 V6 G0 K  g        else
9 n% E3 ~  k1 ?$ \$ g$ @        {; C6 y, C+ b4 X5 L# h
                printf("No effective message!\n");0 ~/ v/ ]& g- @( y: F
        }
; r9 K4 o; n5 e6 E}' P! Z5 s' I+ b/ M4 L4 h

$ g$ C  \$ O6 c3 j; D: m% J% w/ F没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ U7 a, `0 E% D5 ^$ p9 o  G- w3 `9 R" U0 ]
. p/ x0 d8 p1 [* G
) I, \) ?, t; V$ ?/ F

6 X0 V  {; W: s" `5 a7 [# T; u( P




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