嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 [& h, o4 r7 f6 u' T* w8 i6 ?: g' V$ Q  E
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 D# T" y3 g" n5 m$ ]6 d
#include <unistd.h>
6 E  \! ^: d' Q& N#include <sys/mman.h>7 o' r9 d7 j1 C
#include <sys/types.h>1 Q  c  w; V3 m8 c2 |9 R
#include <fcntl.h>& W7 V/ q7 C5 E' d, K0 l0 \; n# i

$ F2 _! T! t( b* s* n0 _& ?#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) y, N$ }# S8 N& G9 W
. z& ~1 L5 h8 d* W  N% Vtypedef struct
  z( L) T" T  k1 L{" V1 |% T" v: Q* g
        unsigned int a;
9 A1 s( E% @% J        unsigned int b;$ `0 ?3 j! l8 R& K: @& q% @
        unsigned int packet_cout;
6 C4 j+ D7 X  D1 m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; {) e4 r2 {2 Q0 V* T1 P5 l+ _1 U* {4 K$ R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( X. \3 S5 u2 m4 \  lunsigned int count_copy = 0;! w  X: f3 ~7 B* X; Y2 n+ H$ A( S, o

; ]3 B, E, c; g% A" m' _( }1 h/ W) N2 L4 n. ?
int main()/ E2 J/ G' P5 ^: Z5 |' f6 U
{" P/ O2 Q4 c, O2 V; ~
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 b' Q) t& N' y! j% L7 E
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( m, ~; ^# T' S8 q) W6 {; u6 r3 @

, B, L( l9 ~" t( n0 g        while(1)
; W7 b, D  b5 H  d        {4 p# E" n# L% h5 T
                read_MSG_buffer(pshreRAM);
2 D8 e- x5 p# m5 @# J  Z        }                # M+ M, x' M' R
}9 J; W( Y% N1 q$ p

& D/ z* M* U4 ~  Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 L( C$ _4 @  x( i8 N{
, g" E9 s0 u9 T8 d        RX_MSG_PROTOCOL buf;. ~4 i% \% v0 q8 o/ I: y: q
        , t$ z: G# m& q7 d/ K
        buf.a = pshreRAM->a;, N+ j6 ?5 H% J" ]8 ~
        buf.b = pshreRAM->b;2 c+ h3 A3 l% }. s
        buf.packet_cout = pshreRAM->packet_cout;
+ r; G2 m$ T2 |8 {+ }& d        ( W4 s) I. H7 `. l# u
        if(buf.packet_cout != count_copy)6 }# C' B2 y0 p# Q9 |# X
        {
7 n1 k8 h7 h3 x$ s9 W                printf("a is %d\n", buf.a);! c, B4 q6 n! Y! k/ P7 J
                printf("b is %d\n", buf.b);8 b2 E. B  N. p* f; b
                printf("count is %d\n", buf.packet_cout);
6 k2 e9 }! ~. `7 b                count_copy = buf.packet_cout;
/ F( J3 o* z- L" m/ \0 m        }
. y7 V; A: ~" d6 E        else  f* F* \3 B! V$ C! c9 f( G
        {8 A5 G8 o: Q8 `9 _0 T1 s$ \2 V1 _) ?' F
                printf("No effective message!");& U7 {9 C0 `7 A: e/ L) m& d
        }
+ J; P/ ?0 ~- V9 D}# |( t+ C  a: m
' l8 Y2 Q5 A1 B

1 R9 v5 p4 p% h7 \8 [2 m但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- [  o2 M5 C( I/ u0 B1 ]& H9 ~9 ?
使用下面代码,对内存使用了mmap函数后:) J5 ]5 h8 z/ k' k  H
#include <stdio.h>
" \  h; z' }0 Q6 z7 ?! E5 \7 {#include <unistd.h>
9 Y8 H0 [( ~3 F#include <sys/mman.h>
# m# T/ j4 D& f1 z$ G6 D+ G#include <sys/types.h>
3 a4 a! ^! U, G! R#include <fcntl.h>
2 r) r& F+ @' V6 K7 O
: e3 o% g+ K% z! p8 M#define SHAER_RAM_BASE_ADDR    (0x80000000). W. T8 R# E8 T+ f0 l' O! s
#define SHAER_RAM_SIZE         (0x20000)   - l- w- z6 z# q! p

1 y# y7 h7 {* Y; Wtypedef struct
* F) Q$ F+ P5 [# P{
  x7 H+ b" _" }; `; o/ v        unsigned int a;
; i/ Q" k$ e9 `4 N) e6 i        unsigned int b;
# @+ I" T+ U* g4 {        unsigned int packet_cout;
, F6 E1 l- ~0 b) m/ m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- P2 o! i( z, y# ~! Z; m9 q
" [" R1 `: v4 A) [  p, G1 m
void read_MSG_buffer(int *baseaddr);2 C4 \$ P  f: N$ l
unsigned int count_copy = 0;
* ?) E7 p$ @/ @& T# u. }; `# m( D0 D% C7 f8 A7 c3 `5 {5 N" O- }
int main()
2 Q) X; k' B& x& K) d+ E{" [; p$ i$ T' n5 n
        int fd;$ [* ^2 T; W+ J& @! B; `
        int *mem = NULL;/ Y! Q- o, ^7 @$ D1 C+ U* J

+ P; S: p9 s( Z% h2 S" g( A        if((fd = open("/dev/mem", O_RDWR)) <0)" ^$ ^/ [3 U- m3 X: h
        {! C. o- k: A' A+ u
                perror("open error");
: z* c: T5 L- e' j1 s$ L) `/ c, i                return -1;. k) s0 x1 U7 b& y1 {9 J
        }
6 G: X# F+ L( u        
3 n& `, k1 o( z* Z+ D        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% q, G& ]9 A! y5 f8 h- U% K  x5 ]
  j3 ^' a& v& Z  g- [
        while(1)
3 n' z# |8 b+ z. n7 u0 Q        {9 m* g: O7 R; {# F; b# x
                read_MSG_buffer(mem);9 H  x. T! f/ f  x0 i7 J/ g7 I
        }               
+ Y  \7 k% u1 |7 y9 g7 [& h( N5 k( [8 y}' ^; G% V# X1 o

4 x/ y5 o  I5 g* \6 N: O% o$ s( B* dvoid read_MSG_buffer(int *baseaddr)2 Y5 d0 Q* x: F, j( v$ L
{/ k$ ~4 H! P9 g/ n( O/ M9 X1 }6 I
        pRX_MSG_PROTOCOL pshreRAM = NULL;) K: l0 H, l$ L

3 q( w% l. @; J* @& ]' B        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- Z4 m5 S* X4 o  a+ f
0 B* t; D3 A+ I& _
        if(pshreRAM->packet_cout != count_copy)
) u5 ?# ~4 u) _# Y$ C4 C, L        {
; q. F: z$ T8 Y8 q0 w4 x# X                printf("a is %d\n", pshreRAM->a);
. {5 t+ l* h8 B) I; U1 y7 \                printf("b is %d\n", pshreRAM->b);( e3 H0 k/ o: `+ K1 Y# ^  b
                printf("count is %d\n", pshreRAM->packet_cout);
0 D1 M  E8 e& T                count_copy = pshreRAM->packet_cout;; ], f4 d+ z  M  T+ e0 D7 p
        }) ]: z* d" H6 i3 a, u! X+ Y6 L  x
        else8 h0 o2 i& J) @
        {+ a9 f0 ~/ @  W2 X& F
                printf("No effective message!\n");1 @5 j2 @  p; r4 ^$ I7 T
        }) ?2 G; E% W5 O6 u8 U
}2 m2 y7 c/ _1 k
2 G. V' @7 e& p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& F- q" u% N0 S8 E) E6 ]" y" h' M5 K2 S" e& t4 @0 H& o9 t
* a* Q  t$ W1 }  y
% Q0 N* `7 x1 ?+ Y) [) j7 Y) z
- ?5 m3 `4 Q* y, [; D" s





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