嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , y0 ^4 q, a3 a& j' m
0 J6 w1 ]7 C; j: ^' c3 o
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 b" m0 y4 h* X+ K8 Y
#include <unistd.h>
' Q  q' C( T1 z#include <sys/mman.h>8 {. x9 n  g' Z8 h
#include <sys/types.h>
+ `, G/ d  y: h9 ?#include <fcntl.h>
8 _1 p/ {$ X" {3 H* s
: m" s$ x# U& I% _- g% v1 O: q( q& S#define SHAER_RAM_BASE_ADDR    (0x80000000)   
# d# j' Z( Z, ?, n2 `4 |2 y  ~1 q  g6 G/ C
typedef struct7 O; f) u  M1 `# E
{* Z7 x  E: R8 q3 f! F0 {# Q: j
        unsigned int a;# W# D9 [/ k) f& ?: S. o6 c
        unsigned int b;& u/ J* f, Q3 F8 L) O2 \4 N. l
        unsigned int packet_cout;
8 R9 t* T$ |; z4 l) B( F1 V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( m; H$ C. y0 n8 k
  _! w/ z3 w0 q- y6 \7 ~# I. zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; M% h5 z3 r" A" r& U4 b  i
unsigned int count_copy = 0;
  t9 N0 }. }0 l. o( ]6 `0 |+ s! D9 |
) }" c! I- C6 t* ?
int main()
3 ~' ^" h$ U" h. E& G1 V* m3 L{- n; |6 f# x  w4 l, n# q) {
        pRX_MSG_PROTOCOL pshreRAM = NULL;
- \# M: t' \$ i. }; P! {        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ x$ u  p9 P  \3 l2 Q6 @! _
6 Q, v" m" k* C) \2 ^1 R
        while(1)
: z5 ?, O0 ~0 g- S0 ^* F        {
/ O4 D: V9 {7 h                read_MSG_buffer(pshreRAM);; M) c- ^; J& l
        }               
, M( Q3 y/ L+ @0 P% d: h}9 a$ T+ ?+ k4 O
5 ?" |( V. a* ?. g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) c8 ?- _1 Q/ O6 B{8 g; s: S  f" V; D6 ], b
        RX_MSG_PROTOCOL buf;4 V! a# ~. n( K6 c4 g" q# s+ J
        ( j! |; U! s! Q( R! {
        buf.a = pshreRAM->a;" U" M: O( s% v
        buf.b = pshreRAM->b;
1 S. ^- ]: e4 j0 g- D, _' g        buf.packet_cout = pshreRAM->packet_cout;
5 _1 \# o% ^2 H' s& L  j" I        / m+ y, A  v2 p8 p
        if(buf.packet_cout != count_copy)
3 ]4 O) o2 Z6 W4 q' k% V        {
) f; {4 H$ g% w* c                printf("a is %d\n", buf.a);+ I* ]7 X4 k+ R& d/ L# j! A' W! V
                printf("b is %d\n", buf.b);$ A8 O* s. C: p, a) C; ?; L& ?
                printf("count is %d\n", buf.packet_cout);
1 q/ n* Y# x& j' l/ O                count_copy = buf.packet_cout;7 o* y6 {3 S+ j1 o9 ?
        }
; g, x) d- n7 \2 Q$ p1 O        else
# X: w4 u8 X- `" L        {+ o  U/ U6 }4 H; {" A
                printf("No effective message!");' l  O* p9 ~& s
        }
& ]' g4 l" c% s- U# C}
# N. b2 {, L) H6 ^8 E
" v9 f1 }! F, |3 P$ q5 I
7 v/ N* Y( Y/ `) |; p9 C  R但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! E) t  u3 ?7 H5 W2 S, @使用下面代码,对内存使用了mmap函数后:
; t' b/ }0 G8 j. Q. Q  a1 v- l* w+ ?#include <stdio.h>) u7 r. K' x8 S4 Y7 Z
#include <unistd.h>: P2 j7 ]  I% U2 u4 c% |6 j' p
#include <sys/mman.h>7 }3 |: p6 n) d6 @2 n. ~- b
#include <sys/types.h>+ j' t# }  Q* g
#include <fcntl.h>
2 O! n% u* k6 A) e$ ?
- P" `* `- K' o2 `#define SHAER_RAM_BASE_ADDR    (0x80000000). ]' E4 w1 T# }! F1 F. }' b  ^
#define SHAER_RAM_SIZE         (0x20000)   
/ g! m" d/ [  b$ a$ J0 ~
& Z& n6 J% J. Q' w4 Qtypedef struct8 e% W4 t0 O) V9 P
{8 p% L4 R& A- L% f9 g
        unsigned int a;
. K- |+ s* ]/ J* e6 [5 y        unsigned int b;( ]; w8 s3 K/ j# O0 `# b1 X
        unsigned int packet_cout;
. Y9 B9 B2 {7 U}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- O  R5 o( N* N7 h. q

' }1 L5 z  Z/ R" z' Bvoid read_MSG_buffer(int *baseaddr);& z, m/ ]6 F1 t* T: Q
unsigned int count_copy = 0;  k# T1 i: n; W

$ D' J: p' J6 hint main()0 y' j+ ^, S6 u5 N- g" o
{* [. \8 y( N4 [! A% K
        int fd;
9 L) f7 F/ I8 n7 I        int *mem = NULL;. o  u$ V/ v+ ?2 i

8 ^* o3 {% G9 r/ W( H4 p        if((fd = open("/dev/mem", O_RDWR)) <0)" I4 b% z5 J! Q
        {
1 f) J& ~% L; [                perror("open error");0 F3 B  _: ?5 [8 G% c1 y3 O
                return -1;
/ `8 M( r$ v* Y- W        }
) F3 }% q* }, X* b        
4 x% j+ g# `( w) R        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);) E* i- y( J4 @' d; M; t

* u1 P! O: J1 y$ y  r9 d% `0 |* M, K+ d        while(1). _. j. M1 s/ I
        {$ s, G+ \9 y( y8 h8 l9 P6 c# V
                read_MSG_buffer(mem);
* o9 i  X( U" r: J1 D4 c: f4 Z$ D        }                ! }: s8 o( A+ d! ~, r" K. j- I
}& F0 Q" ~6 x. V- v9 l

8 C5 @  c. `/ V1 L: Bvoid read_MSG_buffer(int *baseaddr)
9 i8 s  N; N# O5 s{8 E  r! U. W% x! k
        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ U/ P# Y  E% s- E% X+ m" i8 W9 c! m4 q0 x# E* w3 z
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' ?8 k+ _8 u% L9 f; P: \) t
1 @3 N2 K8 L) @0 s, k3 q        if(pshreRAM->packet_cout != count_copy)9 N/ k. d2 c9 T
        {
9 a' @6 e% f: W1 E                printf("a is %d\n", pshreRAM->a);. `  [; S3 v; f& d# V  M. ?
                printf("b is %d\n", pshreRAM->b);
& o/ Y1 R0 r$ }% Z+ e                printf("count is %d\n", pshreRAM->packet_cout);
1 _+ t' C, a9 ?, d/ u5 p4 f, [) n                count_copy = pshreRAM->packet_cout;" C3 g( [) c( L% ^2 h$ H' v3 L
        }% S! K# ]( R# V
        else
/ S- K; V5 d7 F) G7 z        {' N- b* n9 D; J. [$ d
                printf("No effective message!\n");* q$ H! ^' @% v- E8 u1 Y
        }4 E! l8 Q* g3 ~5 O- I1 |/ K/ X
}
  D. @3 |* L  i9 D  [) ]1 ]- m: \, s! O* b0 n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ E4 o1 H; x0 k) {2 ?2 X
0 n4 }* v+ b. K. g: y3 ^

( ?- N" h  v+ F, R5 H* C: A, ~4 i( F+ F0 Z, i

" _+ d: |& E1 \: Z- Q- g$ V- R




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