嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - y* W8 A5 H1 C/ a/ i
9 V/ o( N9 ?. E; J/ a
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 o: z3 _' P- @% |8 Y#include <unistd.h>8 d# h# T0 @4 L/ a7 N4 Q; v
#include <sys/mman.h>
  j: n# [9 T' Y) T; A# K, Q7 P#include <sys/types.h>6 \, |' U  B  R4 c( X9 z
#include <fcntl.h>
( L; C% U7 Z2 B+ b/ ?; c+ I+ U8 @2 B# d( b/ I" o, t
#define SHAER_RAM_BASE_ADDR    (0x80000000)   # |/ z% y. c  A4 n3 v# C! E

: V+ [' F6 u$ V' k- Ytypedef struct2 P" P0 N$ @( R) n4 [
{
: g6 u# A* D8 F        unsigned int a;
7 u0 A9 F4 [' Y+ H  ?6 G        unsigned int b;( a+ o! ^9 V/ H* N4 Z* ~5 @
        unsigned int packet_cout;
- Y$ s8 D# n( H* a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% i* Q1 m! l: j9 z
' g% R$ y1 n( C8 Z  evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) o* f( z7 Z0 j5 C% H
unsigned int count_copy = 0;  l% N. A6 N7 }+ ^# U5 o& T! u

4 `  s' Y, A1 I4 _6 t: d! {
( I3 d0 c- g7 s2 Hint main()
1 `- g4 d+ D, @/ N2 L. s{
, U9 l3 t# O% J. i5 z/ y        pRX_MSG_PROTOCOL pshreRAM = NULL;
- l# \8 @- u( D8 N" e        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;: w* [0 N2 I4 G' O5 c) K, Q+ f
5 H% A2 Z# _( G9 r" c6 ^, G
        while(1)/ b9 W6 d. O8 Z; f3 G3 I$ X; }# I+ n
        {3 K" p7 e$ a5 Z+ d: T& Q" g0 x
                read_MSG_buffer(pshreRAM);
  ]8 R3 V, u, G4 h3 j        }               
6 Y2 _+ N) j4 ~% ~  j3 {3 n( O}
* @( Z3 ~! c* E- K; q9 t1 W8 c2 Q, ], U+ R7 ~0 z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)3 ^2 Q4 |( ]) c6 e
{
, g9 y1 ~! M) c( e* Q) U        RX_MSG_PROTOCOL buf;
' y2 }6 Z4 N- X' J        
& E5 u6 d, d& v' k        buf.a = pshreRAM->a;
% b8 z' N5 |" u1 Q        buf.b = pshreRAM->b;- z) ^" _' {- p9 i, Q
        buf.packet_cout = pshreRAM->packet_cout;, j, K) F" N$ S3 b( s9 B' B
        , I% h; N) |( e- ]3 F
        if(buf.packet_cout != count_copy)
( F# v, Q" b% |  U        {/ Y3 z- \6 L4 `9 M/ s, |3 f
                printf("a is %d\n", buf.a);- a8 w/ [7 X$ h
                printf("b is %d\n", buf.b);4 d3 ^9 a# p( H2 i* ~3 V% |
                printf("count is %d\n", buf.packet_cout);* N* ?, k+ s: }8 @, _7 \* s
                count_copy = buf.packet_cout;8 A0 S. z" a7 F; C( i: b" V4 A
        }
- Q( p! N8 ^7 K        else
( z7 p) H) S% \/ j2 l% {        {
2 i" h/ F+ T7 s/ }5 R* v! r& `! |                printf("No effective message!");  s/ B7 v: E$ G; J
        }" ^+ F3 W. @8 m3 J
}, \: k4 Z2 z: \% G7 _2 d' N6 G

9 Y2 N6 O7 P7 K; v8 P, `4 ?: i4 [3 `" E; T1 [0 j8 l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; u/ L' H4 U5 z6 G; K# L使用下面代码,对内存使用了mmap函数后:
, c! ]$ H/ ^- Y! {* c2 r% A#include <stdio.h>7 g% V. H% s8 `7 `" q2 n
#include <unistd.h>' b* C' s. G6 z2 n5 }
#include <sys/mman.h>5 W3 s! U: l; I- y  [: O
#include <sys/types.h># k* j$ |% j& {- J
#include <fcntl.h>
  [  O( E; s% }5 C3 X$ \& U6 ~
#define SHAER_RAM_BASE_ADDR    (0x80000000)! a; @1 S$ b$ }, M/ ]- C* j
#define SHAER_RAM_SIZE         (0x20000)   
$ F8 F. _  N9 p+ k# x, Q
7 X8 R( G0 }$ m+ V! D0 |" V* itypedef struct+ J% R4 v- n) i; a; b+ ?
{4 h, \4 X2 S) \5 G
        unsigned int a;
8 m& o$ [6 U: P8 D) W        unsigned int b;
5 c9 C# t' w; }* `) D        unsigned int packet_cout;
  w1 ]8 U3 K4 P+ M}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) m6 q" C/ f7 g4 Y- W
+ M4 ?  B, y7 [0 }1 uvoid read_MSG_buffer(int *baseaddr);  ~- g$ ]; q$ ]
unsigned int count_copy = 0;0 y& ~+ |2 x  P
* G5 U/ y. [/ m/ F
int main()' `3 f; L  N8 n2 N  A
{  m* Y0 }" ?" Q8 X' T
        int fd;
! K, u4 X, j7 T+ y1 U4 V        int *mem = NULL;
( I& [$ j& h+ ^5 p: W3 m8 h1 C4 N
        if((fd = open("/dev/mem", O_RDWR)) <0)
( E) \& z% R3 f8 K! E9 l. O        {
; O6 c2 q$ O  k. T  ~# g                perror("open error");
  G: g3 o% }5 Q' W                return -1;  X" K8 F! ^: P6 i1 k& ]1 P
        }5 d5 A* V$ Y( Z8 V. K9 U
        
/ V5 q' j1 Q9 @0 `. |4 U6 H  z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, u7 D7 o* ]: O# K2 B4 o2 L

; m! H: v$ a* N9 h  ?+ o        while(1)
5 A! ^$ h0 |8 A8 w3 ^  D! l0 l2 M! |3 H0 Q        {
( d: i5 Q' Z& j* I) |7 f. K                read_MSG_buffer(mem);$ ]- M/ \  S: S8 h2 P) k6 b
        }               
. i; ]" p# g" i5 d) w# U/ ]+ a& g}
/ B1 ?# d0 g" {  `% F6 M3 h# h, e* u7 N# T
void read_MSG_buffer(int *baseaddr)
& T$ v- m+ u  }2 `{
0 S& q  ]) a! ]4 K  X- Y+ v        pRX_MSG_PROTOCOL pshreRAM = NULL;
; }2 G! |7 U% d: C. V! ?, H* j6 ]& q3 P* X* a
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) y+ r9 ~# D% W8 X- b" E4 @  U

. |' ^# |, x) l, {        if(pshreRAM->packet_cout != count_copy)! _( U. B6 E, Q
        {
( E2 }/ b0 |* i                printf("a is %d\n", pshreRAM->a);
6 `4 V$ I2 X( e5 c7 U                printf("b is %d\n", pshreRAM->b);6 G1 |5 M5 d. L7 n: k6 N/ T
                printf("count is %d\n", pshreRAM->packet_cout);
* Q2 ?- u* w& @                count_copy = pshreRAM->packet_cout;
1 ~3 |* ~3 R4 G& Q; t        }
: B7 B4 @( A0 M! O        else
2 a3 x$ T  d8 H$ w' N        {3 T) V) H9 s+ ]3 o
                printf("No effective message!\n");" W9 U  P% p1 P
        }
! p* o* ?, q; l4 O& R+ j}$ F' ]9 w$ Z1 R. k' n$ _3 F

/ o: j  ^* s) a6 F2 e没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  [9 @$ F6 e7 t9 h/ V8 @0 m

1 l2 r, @4 Y4 R$ x9 v
2 f  ?" [0 y. S) }, e4 W* y2 n
- _) f4 G# E: |, }
9 A$ J2 F  ]9 t" [




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