嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 c! e/ G" ~' p# \! r3 ^: k- H, L$ H; B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: q$ P* R3 m$ c3 Z7 C- D5 t0 R1 g#include <unistd.h>3 N1 |$ \$ Q3 @
#include <sys/mman.h>
+ p: V+ @! k! z- ~3 {#include <sys/types.h>* h) }; @# _1 W/ J" o
#include <fcntl.h>8 _2 E4 |4 c9 j8 C; q# o: P
/ v8 L; a0 h, @( n  O7 ~: i
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 \7 |, u2 P% X1 J! Q1 f* A, \4 ~1 Z6 A7 P! Q& M
typedef struct' D+ v0 ~5 l# J) f. z! X; `
{
% V/ p  m, Y6 B- |        unsigned int a;
, Q& Q" ~$ N0 |        unsigned int b;
& A6 g  h! a# K' e. l        unsigned int packet_cout;( L( \3 _# w; ~- F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! F. w: w/ s: T  k* o2 M. Z& p5 w0 d9 z+ _8 g) u1 x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);0 E0 ]# E: Q9 S" [
unsigned int count_copy = 0;* C: f% C, E  y9 P/ O
5 ?. A. m# g' k# M$ h2 R

9 r: j6 t* O7 C# x9 kint main()
3 j! ]+ G% x! i4 j# F# R{
3 @# ~! k, H7 k$ Y        pRX_MSG_PROTOCOL pshreRAM = NULL;
" h1 p3 E9 @' B6 f$ n        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 I$ u6 q# C3 n: V* {6 e: p1 E

; N+ V7 j0 j# ?. O/ C0 k9 H        while(1)
, n6 ~; E# O% @        {
0 q7 B) w9 @* L                read_MSG_buffer(pshreRAM);
  T) a9 w; M! ?. Z. y        }                ; P/ y3 w5 Y3 _# ^, @" C0 W
}
- r- f1 ?4 |+ D3 ]4 z$ t& @+ v! ^, q1 c* Q4 a! f' Y4 @/ ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& U* \  n# b+ U5 e( M0 p3 {
{( R+ ?0 Y( a0 \: V$ w- _6 p
        RX_MSG_PROTOCOL buf;
& D% p, r  ?. S        9 {0 Z$ E/ W2 r- @1 b; G! T
        buf.a = pshreRAM->a;
8 e# Z9 U7 ?6 a8 ^- ]$ ?        buf.b = pshreRAM->b;. k" v! v  J% ^, `4 O* i! O; b! V# M2 V
        buf.packet_cout = pshreRAM->packet_cout;" }. K7 h) K6 }% f
        
' w5 u/ I6 \* J7 z. i0 r; p        if(buf.packet_cout != count_copy)7 P8 a( l* X) p  c6 O8 o
        {! x. _1 e$ V3 T* E8 ], ^2 ?
                printf("a is %d\n", buf.a);& g4 r9 k% P' @  w* f3 y
                printf("b is %d\n", buf.b);- }" x% D% j4 E9 h, `* P, r
                printf("count is %d\n", buf.packet_cout);
  l! m3 W; `6 r- U5 e' ^                count_copy = buf.packet_cout;
- f* ~0 D6 L; s. O" W+ J        }
+ [! q# `/ `4 V7 `% M2 `5 `        else
2 g# D' o. f% V- y' Z( I0 V        {4 @; [) [! d1 u' r' z
                printf("No effective message!");
) @2 Q7 C3 U6 |; Y        }
5 r/ Z" Q4 ^  {7 |* G! g7 a3 X}5 {: O$ }) ?2 s, w1 |  }' Z" b

# U9 Y) w9 g) s: t1 N. @$ M) r8 t$ Q1 W7 {/ u
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' Q1 T0 B+ @) \( w$ X" x使用下面代码,对内存使用了mmap函数后:) N7 ^1 z$ s) L# q
#include <stdio.h>+ R* s2 A1 m  u5 G
#include <unistd.h>( L6 \8 a& ^5 _1 y% p  Q5 K) \
#include <sys/mman.h>
- l, }9 O9 }+ Q, n3 e) v  E- H#include <sys/types.h>2 S* _+ }8 w$ E8 X) S
#include <fcntl.h>
2 D6 ~' O2 ~3 w' w
, D  v  X- G2 r+ k# h0 T#define SHAER_RAM_BASE_ADDR    (0x80000000)+ n+ b" m. c5 \$ Q) ]5 |
#define SHAER_RAM_SIZE         (0x20000)   
2 i2 @6 j" J! }1 ~; [" k2 D  q
/ A# m7 |. t7 u" u+ mtypedef struct" O& E* D6 ^* P/ N" M1 ^6 B
{3 U  [: M& j7 b9 r
        unsigned int a;
; b( `/ L  b2 T( T# z7 k8 i: ]7 I        unsigned int b;& S" `3 C+ n; \  e7 K
        unsigned int packet_cout;
) H% r+ ?' S& K0 j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" R8 Y3 ~1 P; p7 [5 v
4 |2 o% U- i% I. [' ?8 P* g
void read_MSG_buffer(int *baseaddr);
6 v" v; X: E5 `1 M- T9 zunsigned int count_copy = 0;0 p' P9 [2 Q& {0 u6 b  U

; N5 g0 E" W1 }8 Tint main()
  p. T1 _. p9 c% E1 a{7 j2 V) o* q+ s9 k
        int fd;+ ]1 [  ^9 g$ `+ X: o
        int *mem = NULL;3 X0 ]$ `+ x2 ]* o2 i  o
# [* u* G8 {/ h7 M6 b2 J8 u; s
        if((fd = open("/dev/mem", O_RDWR)) <0)
5 Y7 s# Q/ h, }3 |9 I  @9 k! ^' P" R        {7 @' w& D) b# c! ^- c8 W! [
                perror("open error");
5 Q# ]6 N: y4 _, M' a: o0 Y3 _+ T                return -1;
; o; d7 x8 s( m* p# i3 y        }9 ]  @% H& X0 Y& J8 E
        ) Q4 L& a# I& r7 ?
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) [! q4 o# \6 _4 h; W' Z# c
# D% }6 l0 k. @6 s9 h6 J" s        while(1)
8 h7 P( [- d5 [9 c: ]' k! W  O        {
& a; w8 S7 |! `' x! Y                read_MSG_buffer(mem);* ~; k. M% t& T9 R
        }                & K$ L9 U# W4 t; O
}* Z$ N3 T' _  p1 q! M

: F1 W+ O1 m) ovoid read_MSG_buffer(int *baseaddr)
* L6 e: m  {( g& z) }4 g{
: k* ]" @" ^6 s) h4 [        pRX_MSG_PROTOCOL pshreRAM = NULL;
. p# V" F8 U( {* a
& G5 x4 M/ w9 f7 i8 ]( Q        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ }9 q: H1 g/ q" r6 I
, N" g) H) n6 v8 t/ M
        if(pshreRAM->packet_cout != count_copy)  L+ B1 @# X: \7 c9 ~
        {8 ^9 j/ h/ f6 ?
                printf("a is %d\n", pshreRAM->a);0 u% a2 G- b* |/ Y  I
                printf("b is %d\n", pshreRAM->b);1 L# U' y: U) H  B6 t
                printf("count is %d\n", pshreRAM->packet_cout);8 u7 R* _0 e2 X" Z+ N
                count_copy = pshreRAM->packet_cout;! D& g* R; b3 S5 R+ k& U
        }
$ G5 Q: [( x: K( k+ U$ R        else
. w- r# j! i7 Z# V& C7 M        {* `9 O. z" U9 O7 C1 k: x# z
                printf("No effective message!\n");
' K' z; c2 M; e2 ^        }2 Z# ?% p% @6 O- k+ H& o! u
}
- S% G3 Y1 [" X" G! D! v/ K5 [% K) ~6 Z! B. |
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 r& E* i, R/ a! n6 }" u

8 a. A, w3 {  p* B6 X6 @
$ @$ x# X9 n) [! ]8 ^5 T0 b' `4 _: C! @) F

. P# m8 x" Z, P' `- R# Q% f. L- D




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