嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + Z; u; ?( E1 ~1 ^. M+ Q) k# p
& w: e, n' x2 w  l0 I( H
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>3 R2 i* p! Q. E! ?" L: s  v$ f' [
#include <unistd.h>6 c2 l/ \5 ^/ c! H/ a9 J
#include <sys/mman.h>6 j3 Q; s  O. u' J
#include <sys/types.h>* y$ K" X# }9 t
#include <fcntl.h>
+ @# i+ D; g7 X3 h! H3 L, E0 u
; W4 O4 p/ `, P* I#define SHAER_RAM_BASE_ADDR    (0x80000000)   
' K$ ^5 ]1 O8 Z2 E( t! S0 K/ R5 p" X3 n
typedef struct
9 h) {& M' N* G7 g6 H4 X+ n* L{/ E. \9 E7 l4 K: R
        unsigned int a;
: s" L2 j8 x0 |! M. {7 C7 X$ p        unsigned int b;: h) s. y# L6 ?8 z6 \9 R4 ~; j
        unsigned int packet_cout;6 n5 o, M8 ]8 a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' L' s- b+ |9 {

: g* F, \: {) I! E/ ~7 Qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 A0 d) A! K& S# M% uunsigned int count_copy = 0;: D; }2 g3 z% |
3 {5 q" [; F! t$ M+ D% j

8 m% g2 X2 q/ K4 d, V& H1 yint main(); F+ D! D  E; d" O$ X1 o
{+ u6 p) r  g3 r, k  g6 n4 D
        pRX_MSG_PROTOCOL pshreRAM = NULL;# B/ `3 y, z5 n3 z9 D6 t0 B" k1 \
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# L( S( j) m# P9 I4 R) n$ T( T% C! T0 O# h2 T! i# }
        while(1)! I- }# p* ^- i6 M
        {
. D7 T. E( e4 W                read_MSG_buffer(pshreRAM);
+ [8 k4 ^9 L, N        }               
0 E* s% L  m( Q( a}/ c; g5 D+ p+ k5 Y* V
- K8 d1 M  z' G% X0 T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# |! Y: U: |; [: c9 z4 f( F! H/ m{
/ B# f$ j* y, l& O& b9 W& _        RX_MSG_PROTOCOL buf;) X% {3 Z7 F& s
        - T0 N; h. ^: E6 V: A8 V' r2 ~
        buf.a = pshreRAM->a;
9 y& B; T( I( {/ w( f+ i4 I6 ]        buf.b = pshreRAM->b;
9 p8 ^# x2 f8 N" Z; ^+ }        buf.packet_cout = pshreRAM->packet_cout;
; @9 H( ]- |3 S; `5 r        ) W( l8 b8 X+ C. S6 Y
        if(buf.packet_cout != count_copy)+ D) X" o) Q+ f/ [
        {
6 A+ r/ v6 w% q4 H                printf("a is %d\n", buf.a);
& u  }! C5 }9 V  x, p; u4 E                printf("b is %d\n", buf.b);
- N+ B- h9 q% R. m8 u" z7 O0 w* @                printf("count is %d\n", buf.packet_cout);
8 j" [, j) G+ V# y5 |- d* K. q                count_copy = buf.packet_cout;0 @' b$ K1 f2 O' S
        }. q7 K7 j1 A) b; B8 \$ {( y; ^! u
        else
# Q* _8 }& G, T. J4 o        {" L( X7 B, C( C, F2 A) [6 o5 r
                printf("No effective message!");0 Y2 J% J9 A; {  h) a
        }
3 v! m9 s, R: k3 X}
' P/ r4 S& K/ I2 |! p9 B3 Y( H8 z; K% p1 N

6 |) F3 e( n6 G6 N& B9 q9 O1 J但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  v( f& G5 m8 T; }  g) d1 l使用下面代码,对内存使用了mmap函数后:
8 V; s% L, Q5 P#include <stdio.h>! o0 A+ C, w0 D2 L' b- s
#include <unistd.h>* z7 \" P+ G- w- M
#include <sys/mman.h>
6 [  K7 w( X- C3 W( _* t, Y/ Z- {#include <sys/types.h>
9 Z  l3 W, l& G) F#include <fcntl.h>, R1 m5 w" E; @0 a6 a( q+ x
9 k0 k0 A, N- \- s$ q" G
#define SHAER_RAM_BASE_ADDR    (0x80000000)
  Y# v* ]6 F7 q. e#define SHAER_RAM_SIZE         (0x20000)   6 [; \+ Y( Y: t9 b( @
, u' j" ~. r/ u4 T, ~5 b  }
typedef struct% |! w, E5 F  a
{
7 p; K, ]7 u; F" o* L# R        unsigned int a;- U  F! o6 d0 J# N% T9 _: l
        unsigned int b;9 ]- }5 f' w" m' Y, Q
        unsigned int packet_cout;2 h0 o6 ~! B0 t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ O9 G6 \; D8 @2 w, U
2 Q4 ]4 d% C1 ~% mvoid read_MSG_buffer(int *baseaddr);
- N: S" `. e* h6 m+ S+ E9 }5 eunsigned int count_copy = 0;" n4 `: b: w# b+ x: ?- d

& @: R0 T; s) [! y0 p8 Nint main()
1 m  O& N+ A2 j1 a8 A{
6 @% W+ @! z1 G" z        int fd;* P4 x2 _6 }7 f5 S$ u2 P# j2 a
        int *mem = NULL;" O" m3 Z& k" C: T. a# f
( D( G7 s% d, a
        if((fd = open("/dev/mem", O_RDWR)) <0)$ h7 k0 y. B/ T- W; l
        {
3 ^. O9 v7 I" M. P; D+ y                perror("open error");' n( V5 t  E; E
                return -1;
* s/ t  x7 L. G7 O: n0 `        }
( j4 z1 _1 b/ _, h/ X7 R        
* [* ~# |5 O6 U# ~; `        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 e3 i& M+ f( L* z5 s
% V0 E; `5 E5 a9 w
        while(1)+ Z; }1 D4 V; D- v; ~4 i
        {4 b8 Y6 C8 P3 c* G
                read_MSG_buffer(mem);* S, k' K# |0 C8 I
        }               
( h% N. [' m" X; j}
& I8 Y  l% ~, ~9 h  E5 M3 ^- Y& V' e+ T. u' e
void read_MSG_buffer(int *baseaddr)
; p/ }' k# _7 Q4 w0 J{
# s" U: O3 [# O# B        pRX_MSG_PROTOCOL pshreRAM = NULL;# i' l* k& I; `6 U' g, V6 z+ o$ H, M2 ~! p1 G
& J8 v/ ~8 ^1 g5 Q- _' s3 F
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 r: |5 {. p" G- h
! ~- c' _0 ]  b# T6 \
        if(pshreRAM->packet_cout != count_copy)3 B! S" p: J8 ]3 w  @/ z
        {
4 a& k9 Q* R: c                printf("a is %d\n", pshreRAM->a);; X' p' S+ K8 P! A% l" l$ d( q3 N3 Q
                printf("b is %d\n", pshreRAM->b);* T# @$ F$ q, `
                printf("count is %d\n", pshreRAM->packet_cout);; O4 j6 `' G( o9 S2 T1 c; P
                count_copy = pshreRAM->packet_cout;
/ |$ L! r( L3 L! H/ V) O        }
: a8 K; C' Y  S3 d, Q6 J1 G        else
; M6 a! T  T" c) U0 Y        {
0 P, c' r! N- j, X( H' w( q                printf("No effective message!\n");: P! w+ Y: u& h, c  D
        }1 V2 W/ v( l* \+ q' N$ W9 @
}
6 I" l( s, a6 M! ?: w
# C# H9 l' v4 {5 G! V: o没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. \5 P  N# _) N% \" u! ^9 [/ d
0 d, b) C  d8 @6 u7 X- N! b0 I# _3 q9 j) B; o
0 a+ w( f8 }3 W- U6 Y; K& P

: T5 p* I* \! u/ J) X( G* u4 ?




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