嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % Y. j* a' E( i' T) A- ]
0 z/ c) j  w; U5 |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 i  e0 `$ k5 p3 b- v#include <unistd.h>
: a+ U! D% h; n. u- B) j" [#include <sys/mman.h>7 o9 k: r, x* g) C; P
#include <sys/types.h>3 r0 v( Q% o0 D+ U# H. N- z
#include <fcntl.h>
3 c1 G  S" w5 b& T- N4 n" z4 b! j7 K: K
#define SHAER_RAM_BASE_ADDR    (0x80000000)   1 u: J' B3 M8 ]* [3 ~/ E5 q
3 z. f* e9 t; S6 ?* |1 Y
typedef struct: ]7 Y# H9 p% N" v# d% l& z: k" t
{
8 g* N* X& {1 S  M1 e3 _+ y7 C        unsigned int a;
! h" R! Q$ W' U+ O- W: P) p8 S6 d        unsigned int b;4 r" m6 C) [8 Y. o5 b8 n
        unsigned int packet_cout;) f% c& u$ ~, {) V2 `) E1 ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: ~* \: T, S3 O2 Z) H4 @

$ y6 B5 Y+ u! w! D2 v  p# vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. L% v! p5 T: f- c( vunsigned int count_copy = 0;! p# H) l8 A( j" v: a
+ F% V% _! n! x$ F( Z2 S) A
- W. {( y* G1 q4 M
int main()
% Y8 D* A3 |0 g7 I$ Y4 o{/ }9 f- s. |# [6 Q; N
        pRX_MSG_PROTOCOL pshreRAM = NULL;; }# N5 F' P% W
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  |. M* d. u2 j, G9 b
, k' B& ~5 r6 h7 k7 C) Y( ^: _/ s
        while(1)
. I5 i; t5 s! h' A5 k3 d7 }3 }        {7 P* Y- M" _! _0 a% [: E# O
                read_MSG_buffer(pshreRAM);/ P  L, x$ F; x/ g; h0 `, ^
        }               
4 t+ k  z7 q+ K* p4 G5 j}
) N0 R7 l- T& [* b
" _! `7 ]: B) Q# A$ c0 v% U# @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. P9 R7 L- x- S8 h! F! I9 W{2 w2 F" F* Z/ j
        RX_MSG_PROTOCOL buf;# U% g( H  D- |& ^0 k% b! f$ U
        ; ~9 R& F! F3 b( k, b# R
        buf.a = pshreRAM->a;
9 @8 E, R8 o0 t: A8 Y3 u        buf.b = pshreRAM->b;
! u3 M; O4 f4 h8 O& S8 o2 B+ y        buf.packet_cout = pshreRAM->packet_cout;
) e& J- c$ O  l) ?, B4 R        
) ?3 P4 E) {( z$ T        if(buf.packet_cout != count_copy)2 S+ w$ j" \% u5 g+ h& e
        {
% a& j% q3 T: Z2 \% H4 |/ j                printf("a is %d\n", buf.a);
  [6 B0 L, R5 I                printf("b is %d\n", buf.b);
7 i; T, D5 @6 L: [9 |6 I                printf("count is %d\n", buf.packet_cout);
9 T  k* F" b) Q                count_copy = buf.packet_cout;- E# @9 K6 E0 V& Z7 ?+ Q3 E/ _, y
        }* \( C$ ?4 s/ c; p& G
        else' c# m& p/ D) a. e6 z3 f
        {, w6 j  [3 P* a6 O/ S$ v
                printf("No effective message!");2 t8 O3 U  F) a. n' \( [+ i
        }
; g' B, K+ \. @}
7 m# B' J3 w* M% l) c5 T. F0 a  f5 X. R, N& }; A4 c

2 e2 ]6 \) G  V" r  |2 B( V$ `但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 v3 U0 W8 H! d7 H
使用下面代码,对内存使用了mmap函数后:8 l  I1 A/ Y" u) C) p- N3 ~: z
#include <stdio.h>
6 }, e5 a' F5 E' Z+ \#include <unistd.h>! b* c5 M* z2 X/ m% ~" Q, i
#include <sys/mman.h>
9 b8 c  r, X% a% \, M; w: f#include <sys/types.h>
! k- ^( T5 t/ V' Z+ y/ Y#include <fcntl.h>
/ T3 b' f: k* J( l8 E4 c4 v4 e: X1 }$ q9 P, I' ]# e2 }& q
#define SHAER_RAM_BASE_ADDR    (0x80000000)' P  f- j: T) q0 B4 H2 o$ z4 _
#define SHAER_RAM_SIZE         (0x20000)   
" d# o' \  Q0 d( S2 R. U  l8 s
2 g! {( Z( E2 b3 u: rtypedef struct
3 e0 O8 F9 E2 \# A3 G* y. T{
* d/ f7 R2 X3 ~7 ?+ [1 ]/ ]        unsigned int a;2 l. B: F; H, K& |  H
        unsigned int b;6 i4 p7 D, P) `8 P1 m' Z. o
        unsigned int packet_cout;
+ X/ c! U/ ^' S7 ~! c) G; J( t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; [) v+ {0 f, D- w
: h6 g) d9 \) A3 D" K" pvoid read_MSG_buffer(int *baseaddr);) Y5 }9 U* Z8 {2 k8 r
unsigned int count_copy = 0;2 F! x: f- [: y* w5 N5 [, o' U
2 f4 }' G4 T- U+ C% \/ a# G0 l
int main()
% B5 K5 R+ ?! i4 r1 v3 K  y( Z' C{
$ r, S  v; O2 r        int fd;0 t, A+ S8 v0 z( r7 p# U6 s
        int *mem = NULL;* Z8 C: R' y- g0 I2 o
; R' K: b- L3 Z: X
        if((fd = open("/dev/mem", O_RDWR)) <0)
1 |! E. A1 I# K* [        {
7 K6 O) \4 V6 J& N1 e- W                perror("open error");( T2 h+ Q$ A4 ?
                return -1;
7 ?# m; C. E: s        }
) M. @# V! H+ j9 K% i- q0 {, k- w        
4 S; r2 D/ o: P: i. I2 Y5 O! K        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 D: K3 r8 B6 q1 x( J

* C. Q$ u# r6 E% w        while(1)4 E/ J0 Z7 W- o. p- a; O0 Q/ M
        {* N9 h" A, V2 l" [! H- ?
                read_MSG_buffer(mem);& w3 y# ~9 @1 [) D3 Z
        }               
; d& t' `" ]. u: ^}
# K; D2 A& b! X5 l5 l% o6 x* g2 R; C; P' h) V( P$ k
void read_MSG_buffer(int *baseaddr)# B  x7 [7 o- x
{
# A" ^  K  q9 e# p0 C; a$ u        pRX_MSG_PROTOCOL pshreRAM = NULL;, @/ z$ B8 b2 F* t" M: M7 y
9 t, S, ^+ O. i
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( j2 V& T6 I& r! I4 F  x( A" o# Y2 C/ \1 S5 a
        if(pshreRAM->packet_cout != count_copy)
1 f% M2 H! w+ ?        {' b2 \  j2 B  N, J1 S* @# K
                printf("a is %d\n", pshreRAM->a);
' L) c$ v8 A: q6 A: Y                printf("b is %d\n", pshreRAM->b);
9 q) H, q! j8 Z  {: `$ H, L                printf("count is %d\n", pshreRAM->packet_cout);
$ r+ \* c  S7 g/ @% K. f  D5 c                count_copy = pshreRAM->packet_cout;) _% B4 y0 o8 g/ f  g
        }  C4 w! ?8 h8 w$ `( m. v
        else
. p& S# e4 g5 j: J3 @        {% |/ }6 B! H4 b6 v
                printf("No effective message!\n");2 O+ p+ M+ D% Q( N7 n9 q
        }' \1 W  Y, A9 E" ^8 d
}# p4 z+ F8 g% t

% j. J% [4 E. Q没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 b% v' v; k( s' ~8 d" I- h
9 @3 |! A" ^2 \0 o# \

9 C6 a& S9 y# V) H! U3 A& }2 c0 t
: ]9 m+ G% _8 J  ?





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