嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 ], H6 [# i+ w- m5 C) q

+ L6 r! O+ [3 @OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: o4 g1 N! [8 m* ^3 V#include <unistd.h>! x- T4 J$ O: M3 A$ A. S
#include <sys/mman.h>- |% F( O/ b3 }
#include <sys/types.h>
/ {/ O$ Y) O  h2 }9 a, B4 y: ]  M#include <fcntl.h>: r7 q% x/ p; r/ P; e, |" I+ Y
3 @6 x: z* ]! I- y) s# `+ D
#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 ^7 s* L5 ?: t! S
( b6 s# m* U+ P* _  T4 s6 s1 V
typedef struct9 a' j& |4 A* i" X# O
{/ w: I- N+ W2 Z0 ]& g" i1 _
        unsigned int a;) Q' Z6 E+ g6 @$ v, T$ k
        unsigned int b;5 v) ~- J1 d1 F, ?. z" x+ e
        unsigned int packet_cout;! T& K7 k! M9 F7 p' O( d2 _# W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, P; P! \' x& v! |7 b
/ N* j- w' {$ Y4 G+ Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 b/ }( v( j1 {( e* E
unsigned int count_copy = 0;
+ Z( ?1 ~4 w/ f3 i# n8 c
$ H$ c& U* E9 p3 |  H8 Y3 O* |9 H7 ^( R  c6 ~4 _( b0 ^7 Y0 v
int main()* t  v! {$ p, M0 U6 F# t6 y
{
' X) ~# {! D0 l, J+ A        pRX_MSG_PROTOCOL pshreRAM = NULL;$ Y, S! R( w7 E; p0 B2 [. f  s( m
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ x+ s2 ^+ b* a

$ o( M0 p6 s" z  m$ D9 U/ `( m        while(1)* N6 Y$ z7 `, m4 J6 H6 I
        {; o+ T, j. I4 m  V" [
                read_MSG_buffer(pshreRAM);+ a  F* g) g/ S% n! @) w
        }               
, j8 K+ W; u1 a/ _" }0 t9 z}4 c! Z8 q2 U# m# o+ X$ r2 W

9 X: g$ j8 C  V* \$ _: c/ @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), C9 O, |. Y: Y4 N4 B
{
; W% r( {; ?3 ]* h) [        RX_MSG_PROTOCOL buf;
$ k' O% n. y/ l0 j% [- G7 ~        ' N. v+ v8 Q3 k( w( u2 Q
        buf.a = pshreRAM->a;5 {% f/ f2 M: f8 H( G6 i" U
        buf.b = pshreRAM->b;
" }' ]9 n& {  j) _6 U        buf.packet_cout = pshreRAM->packet_cout;8 S- `) y6 X5 U4 R  H
        
( r7 N' ~) t' ~: M  l; R2 `        if(buf.packet_cout != count_copy)
2 R, o8 P: B5 H: C- ^* t; P: P  u        {/ w) N; S* {# q1 V/ h
                printf("a is %d\n", buf.a);7 n9 ^8 X6 h' w) y) i9 a
                printf("b is %d\n", buf.b);9 M9 v2 F/ Y$ \1 Q: |& i9 q
                printf("count is %d\n", buf.packet_cout);5 N* M& }& l* B3 G5 W7 F. S5 D4 N
                count_copy = buf.packet_cout;
+ X. l% P2 M- k- K- p6 A- }  M        }7 [4 o* o) d7 x1 x
        else
- x9 O. h" N+ s4 d4 R0 W( T9 j  B        {9 R1 j1 Q; ~; A  @6 A
                printf("No effective message!");
& q: ]  [, A9 Y4 o        }8 p6 o1 b5 v, k
}' D) I; w1 C* N3 f, f

0 b  c+ v% A; \. J2 w7 c* W: b8 l8 ^3 ?/ w& e4 \$ ]5 z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 v0 ]! B' [( C) s- N" @9 o' j
使用下面代码,对内存使用了mmap函数后:
  k8 I( {) m. K#include <stdio.h>, k6 z/ ]. |; L
#include <unistd.h>. j9 h- o6 h7 O" J
#include <sys/mman.h>
, \- o1 M# j- Y7 y' z* R#include <sys/types.h>% \: i* Y* A' q* h( Q
#include <fcntl.h>0 _+ J: Q( }" b5 [3 V$ E1 Q

1 N) B' R  }0 g! o  T#define SHAER_RAM_BASE_ADDR    (0x80000000)  N9 Q) ]) V. R& s/ v3 F" L! K& I4 Z
#define SHAER_RAM_SIZE         (0x20000)   3 n2 k. h$ i0 p6 K, P/ ]

$ U6 c1 Z, E( W7 \typedef struct# R; c5 F( v) j5 u. W
{
. P; ~- l% g: n        unsigned int a;/ {# L# g! s) b$ @- Y
        unsigned int b;
) ^4 J0 E; E, g' n" n7 i" p( Z  _/ U        unsigned int packet_cout;
/ D$ D) X( F0 `: p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- @9 S) g! k# A8 S5 B
3 k; S0 M+ t. w" r( Z5 o' ^+ z
void read_MSG_buffer(int *baseaddr);
- J, v6 I. Q* r+ X4 F: Lunsigned int count_copy = 0;  X; I5 ^3 v; O' S

( D+ F9 s! g- d1 u& g% _int main()  S; f7 c5 V% F2 X; ]6 m& R6 F" z
{
+ Y2 M3 s9 r% G, C, [- f" b2 W        int fd;, T2 H3 `9 Y, D  J* U
        int *mem = NULL;
8 N  ]  r+ @9 |* @: x( W+ W
  ~5 O6 {4 q+ |* {" S        if((fd = open("/dev/mem", O_RDWR)) <0)
% ^/ x4 `7 ^) d7 |! C        {
: i* N1 [# i" h4 v5 B0 @                perror("open error");
1 T& [* m) _* P1 K# ~, k* w2 u                return -1;* M3 X6 P% d; [
        }
7 F6 Q/ g$ S7 j( V* p6 O        " O' [5 L5 f+ Q5 @
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( A% P& S. ]$ n6 m4 f4 {) S" _6 A2 Q/ o$ u' M" F8 L
        while(1)
; o/ V& E" `5 g( L' Q/ A, r        {7 y3 s2 E* V/ e3 o4 Q  P3 Y4 V
                read_MSG_buffer(mem);4 P/ e8 U6 M# k' g- N* b6 J
        }                2 p) M5 |5 I7 U! o
}- C$ d0 u- A2 U# o& g, W& p. p
6 v. l: D* ~$ l$ y6 E, p
void read_MSG_buffer(int *baseaddr)& ]* x: q8 K: z2 K
{: x! K, q: Y% G" i$ M5 M
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 h, W6 d0 B) B! P& Z
4 [  f+ O) d4 G- q* J" v  U+ V
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* ~3 Q- {6 p! l" D9 A% |( K  {, C$ Y
% U, v' w8 B* ^) _6 @, S
        if(pshreRAM->packet_cout != count_copy)
0 M' V3 _  p/ s% \0 v# _- }! U  z        {7 t! U/ q" W6 m, ]" c4 M
                printf("a is %d\n", pshreRAM->a);* s" w- W8 \! R) _5 d* X* o, U: O% O
                printf("b is %d\n", pshreRAM->b);/ S" S8 d. f: `- k
                printf("count is %d\n", pshreRAM->packet_cout);7 K; `2 t+ z" p1 ^$ z- Y
                count_copy = pshreRAM->packet_cout;
* G# {6 G! j' o2 R* e/ ~1 \* m1 ?* d        }
" s, g, n3 `5 I0 [3 d        else
& l' n; H! f" R5 z& w        {" [6 W# J1 x4 h
                printf("No effective message!\n");
" `" t. G2 }9 `- b8 Z( g: [* J        }
" |" f6 S, N3 w}
9 H0 n9 U  Q1 x& f) `- [1 ~$ v; H, ]# j( G; W* ~9 n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( `7 n% Z' w% F5 e& P
0 c9 z' ?" Q: }% T( n% L, J& o# m( k+ C4 ^8 K1 o0 @# P5 N& O
8 w  t4 |% k7 I8 _9 z
  s, W" z- g% x





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