嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 N9 ^3 {# F! U6 R. _* p# `. S$ r+ W: E0 N& Q( o/ [) O
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ j& h0 O* W) ?% _& I/ Z#include <unistd.h>
! ^( D% c" G" k1 e#include <sys/mman.h>5 r1 H& Z5 Q5 A, }; G+ n
#include <sys/types.h>0 ^) ]( D6 @$ I; A) q1 [
#include <fcntl.h>
' W* m5 S8 [) p; |. K/ u( J$ o" i# ]' K  ~. Q% y5 f! X. @  }
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
8 N2 Z: k2 S+ Q1 M& p. s4 |9 L8 q$ a2 }- s( A' \! T# z; T
typedef struct
! o/ `# }9 O. o/ Y" W5 L% o- b{# q1 X) h; Z1 V4 c& `
        unsigned int a;
' j! j. o1 H" G        unsigned int b;
# I0 X- e( c  s3 s/ d. B        unsigned int packet_cout;1 H% t1 T& d8 b( |* d. e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, j$ z7 X+ ~' T) H( u9 l5 M7 m
4 j* G( ~& C- C" z2 v# B$ R2 [% ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) d( d0 i6 U- C9 X& e2 funsigned int count_copy = 0;$ f( y* s/ {6 }! }# B* `, T# _7 k
- b- Q' ^2 k5 F3 o; Q) J* i( q

  E" \1 c1 T# Wint main()
% g' _  o" k  e. S{: Z% v. z" E) \1 f. K
        pRX_MSG_PROTOCOL pshreRAM = NULL;, C) ?' h; X2 L8 i: Z! h
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* E  K: ]! k& f' W1 \

2 i7 q3 h  N8 F: X) d" R# U; N- M        while(1). w; n; x2 i, @3 k+ c2 U& |
        {
# P4 D: o% C3 ^* X( v) Z; h" m' u                read_MSG_buffer(pshreRAM);
1 M2 j' P- y: W6 a        }                4 ~$ t* g: F2 S0 Z9 Q  T' j( h
}5 X+ {4 ?' ^/ \  G

9 C% L) @2 d" |  r8 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 m/ e6 X  D  Y& _  E! g0 P* J
{. M* O  A  S# K2 U
        RX_MSG_PROTOCOL buf;
- u6 `- K" W" E9 X6 E        
/ |' T" T" q6 {$ O* @8 @        buf.a = pshreRAM->a;
9 H5 p( x  m/ J+ r7 M        buf.b = pshreRAM->b;# G/ ]/ S1 z. Y2 b6 U
        buf.packet_cout = pshreRAM->packet_cout;
7 K% p# q: }! M4 |        5 {) N" E" M! }" d
        if(buf.packet_cout != count_copy)
0 b; O0 y7 S! _6 S' j" F        {
: `% M9 ]. c6 ]! u5 `3 N1 b                printf("a is %d\n", buf.a);
9 B0 |  Q( e: W3 F                printf("b is %d\n", buf.b);
1 p7 V* f& d/ {! I0 `                printf("count is %d\n", buf.packet_cout);1 c4 Y) q, f6 }4 I1 C
                count_copy = buf.packet_cout;9 n7 X- k! x+ p- G" C7 J  k: d2 @
        }
- ~# h, A( Q) }7 E. W        else2 b' W! L1 }' T5 [3 k% m2 I! S
        {5 E, }0 \: x: ?" P5 Y: ]
                printf("No effective message!");( X4 c, |/ I" p/ ?- c6 I( w1 W
        }* b# T6 T6 M, d  n! o
}
' T; A, g0 D3 ]# q- k# X; K
9 y/ @  U  h$ R
& \: O, ^6 ?+ F* G  y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 D" ]% U) k! ~) o7 I* P5 _7 _- K
使用下面代码,对内存使用了mmap函数后:
9 K  v. T/ }4 [: [+ x# k#include <stdio.h>; L' O* h( q% Y% c
#include <unistd.h>0 X7 d9 j0 ~" s6 I
#include <sys/mman.h>- Y9 H+ ^  j2 j+ X  c! T
#include <sys/types.h>
0 h3 d8 z% r- d+ \3 t) T, v+ b#include <fcntl.h>
7 ?$ k% c" Q. Q( E* H9 L- k8 w& v) W$ M. g
#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 D+ _( E7 N( Y( F5 r7 L2 [: C# L#define SHAER_RAM_SIZE         (0x20000)   
: P6 l- |3 Q, k. n- S8 w  T& Y" {) M5 V, f
typedef struct
3 n! r. \& G$ q8 Z( ^5 s0 N, x{* O  y! P2 h+ k3 v8 x$ [! e# b
        unsigned int a;
) T( x! t" p5 C* a' g        unsigned int b;, `$ S3 J' y2 S+ N9 h$ |* p  t5 T
        unsigned int packet_cout;
0 t  J* w& ^8 s) ]- I8 X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% X( F8 @" B7 [
+ z$ e( g7 E/ n0 Y* X5 G6 n
void read_MSG_buffer(int *baseaddr);$ Z8 z9 ?0 a8 N/ n
unsigned int count_copy = 0;( X5 C9 b/ }6 j; `9 S4 U
1 q" R+ n8 w5 i5 m/ p  z
int main()2 G3 B% k% e* a1 ?9 g% s8 z% j
{
9 X# j. |) n. P  n. _        int fd;# A3 B0 }$ @( u' d# R- Y& r/ u2 x
        int *mem = NULL;
( W( U3 k5 l1 e
* P( f- t: K% i" W0 E/ q        if((fd = open("/dev/mem", O_RDWR)) <0)8 M+ @6 P( \$ v
        {
( V4 w  k1 F, O+ ^+ K                perror("open error");
3 j: C5 B% |/ I& _5 c4 ]' L                return -1;5 V/ [9 D( K" d; q3 g7 [
        }
" R' @% L' W3 z) m( h        , i' z: z' ~; c& n5 U5 z7 \1 v8 d' u/ A
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 Z: s& _! r" {; M

) _8 p) i' `0 ~" W& ^        while(1)
/ u6 u: Y% V; A( m0 n- L) R        {6 h7 ^4 C2 ~! D$ A5 d$ Q
                read_MSG_buffer(mem);
3 O" K& E1 m1 h* y4 w1 e        }               
& E' ?+ V) Z# q2 l}, E  _7 X" s$ g) ]; b) l
7 w) `9 W+ h, D0 Z3 R! @; t
void read_MSG_buffer(int *baseaddr)
7 w5 r3 X: H- A; c- f{0 w8 {) G. E7 z
        pRX_MSG_PROTOCOL pshreRAM = NULL;: h; R7 p$ x" R/ f( D5 L1 ]7 n
! |1 Z0 T8 j( a5 S) X- r
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, Q8 u+ q  ?" i( H5 v3 T4 E, Y/ w4 X
        if(pshreRAM->packet_cout != count_copy)% |& y; ]( F9 a8 r9 X* P
        {
1 g( p2 D2 T$ C/ {# h                printf("a is %d\n", pshreRAM->a);
' P3 E! g* [& S# O                printf("b is %d\n", pshreRAM->b);+ F" w& f/ c' V# I) X5 R# Y$ H
                printf("count is %d\n", pshreRAM->packet_cout);
; W# U' g$ S, B                count_copy = pshreRAM->packet_cout;6 K# X9 w0 @6 L% W$ @1 E9 w& A9 ^0 O2 ?4 O
        }7 }' U! \( N9 f' G  \
        else( Y7 I. I3 s7 l6 s% O
        {- F; V/ w4 P1 C" H
                printf("No effective message!\n");- `" f8 k* ^; J  q
        }' N& [2 f6 Z& V  B, P) ?
}/ r, [& [0 }: g1 |3 w
- ~. q' t. ]# i& Y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& d/ m( O. A, x$ B; m% ~, K3 @* c" N; ]$ l# C: ?) e5 w) F

8 }: E( @! Y4 |, K5 f8 A2 {+ u$ K7 x$ B3 g" C: f+ w4 Z

9 Y, O" x7 s) X




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