嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 l. n0 ^" b) M  z$ r% K. v
8 y7 h, v  d3 K0 t! ^: s; a5 h: LOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ _& j8 W# {9 r" L* ?, R1 |  ]#include <unistd.h>$ _6 |- R& z9 w7 i
#include <sys/mman.h>% E& d, r! ^1 `
#include <sys/types.h>
  d) b! f" U2 Z4 G; ^' S#include <fcntl.h>
# ~) W# H$ V$ p3 ]  N4 I* Z# w8 Z/ o% i: F4 o; e
#define SHAER_RAM_BASE_ADDR    (0x80000000)   : L' F9 t5 ^8 n: T9 e% W

; s2 ~% ?7 \: r2 Qtypedef struct
( N: o% m: N; u% |- j6 U) i! ~9 A' T$ c{
4 j# _+ D  p6 w        unsigned int a;6 Y8 }+ i: f* z. ]% ^
        unsigned int b;
2 W- p9 ?. X4 w1 J        unsigned int packet_cout;
, z4 l. c5 T9 l1 F  A1 m6 I7 c8 C}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% x& \/ L+ R/ A" c- m' D& q5 A
2 Y( H+ v6 O0 X* [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& ]# [( q5 y% k2 y
unsigned int count_copy = 0;! T4 o! x) J$ g0 |5 V  ?, P# B# h

. ?6 Q0 i' p. u4 G
' ~' L( ]) R$ I. k4 Xint main()
( i' h. H, l$ }+ }$ ]4 |1 |- h{
8 {; ~& ~% N1 z/ N% X6 W        pRX_MSG_PROTOCOL pshreRAM = NULL;( b0 S6 G6 [: j- f
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 H5 s, Z, i+ t* f* t% i) r& M5 ^* }7 P# F) Y+ G7 ]) p9 {0 L
        while(1)
! {, w( P4 i5 v0 m* R; g        {3 v" U+ O7 g7 i7 U# b
                read_MSG_buffer(pshreRAM);
1 F5 o/ H) K. I1 l5 T4 J. l* K        }               
2 t8 U! `$ ?3 P5 M$ S}
. B+ C2 @7 x& L% I
5 x, ~' o- H/ x4 t3 c7 a% ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 R3 T0 ^2 S8 U8 @
{6 J; }6 [9 v( l( {. a, H
        RX_MSG_PROTOCOL buf;- F; k9 M7 ~2 Q4 z2 R8 P: t$ w
        
2 T: m) o1 F1 |+ Q        buf.a = pshreRAM->a;' r, Q" Z4 m: |' J' z
        buf.b = pshreRAM->b;- p( |3 [- T6 f
        buf.packet_cout = pshreRAM->packet_cout;) C( Z3 L0 q) U" n4 o: _
        ) D9 L4 N& E, i2 R. n8 V& D8 y
        if(buf.packet_cout != count_copy)& L2 s6 Z& ^0 z  ^3 f  J* h
        {* x" j- j+ x6 g9 h6 n
                printf("a is %d\n", buf.a);
. R  k0 ~3 `% m                printf("b is %d\n", buf.b);
0 m" j+ G6 ?7 G, V) q/ W/ Y, s                printf("count is %d\n", buf.packet_cout);( V0 [8 b# |$ t9 o/ O) x8 L. K
                count_copy = buf.packet_cout;
$ X6 n, M; g6 c; J- N        }! ^  ?( J. w; B
        else
) R, t$ @* `% a: H5 ?, P        {
/ C1 }, D5 H  q) o7 W9 d4 ~7 `                printf("No effective message!");
8 h2 E8 t1 N& H' z7 s+ f        }
1 {: \( Y2 G: |9 p1 l& c. C6 p}2 l& x3 W( f# W% S; _3 @

2 v. H0 ^1 _; ^) |; F" K- g: y  a# x* T) k: F8 U0 l3 N. k  _
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 q8 b' a" O. w6 F5 W& b
使用下面代码,对内存使用了mmap函数后:! l% V+ I8 t0 t
#include <stdio.h>
0 a9 [1 ?) {$ ^" _7 C( @$ ^8 R#include <unistd.h>) N: X  ]  D# j; g( b
#include <sys/mman.h>: E& i5 M$ ]) y7 p% L0 I2 M; l- M7 v
#include <sys/types.h>- o/ r- l0 D  p# ]
#include <fcntl.h>
& s% y, S! |; d& ~
5 X& c& M: d4 A8 O) {#define SHAER_RAM_BASE_ADDR    (0x80000000)! z9 |2 o' i! D  r0 N
#define SHAER_RAM_SIZE         (0x20000)   & q" P: }5 |8 L( Y( x, P. R' I/ q
% c  k+ ^) b) ~
typedef struct- [0 ]( w- b( F
{
7 U) G. @+ b! U5 ~* K  n" K        unsigned int a;
8 f# W1 ^' ~* F6 V, F. v. ?        unsigned int b;
  U& a" K6 a1 ~) A4 ~. |1 F3 @" P0 m        unsigned int packet_cout;+ R* O- x4 {$ |0 \! c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& G( k* p+ E) b  S8 }0 O: \8 F$ D: m
1 j! J' Z4 I( w6 |+ `$ x. Yvoid read_MSG_buffer(int *baseaddr);$ n6 U* R( [0 B) M* W6 H3 z2 k
unsigned int count_copy = 0;0 H1 T2 E. p8 L8 z3 }( L

# L0 h- |* W. {! @# Cint main()1 c( V1 P* e! `
{* x% m3 j" `; f4 `9 a; l- M
        int fd;
6 d/ w: }% q' r2 b: `! ]        int *mem = NULL;
! z3 r  c- Y& E* m1 }5 P8 u$ l
# G8 q- j1 I0 Z/ ~5 z        if((fd = open("/dev/mem", O_RDWR)) <0): C) U- H! n/ _( h+ ]
        {0 E( j" b$ o& M
                perror("open error");
+ T" P8 v3 Y0 F5 Y                return -1;: U( E  a! |" ]3 |& J  h
        }/ _, _& B7 D* \- a4 w( B, d
        
5 e5 e5 `: q, ?1 {, X* b& v5 c( I        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ r4 M; \/ ]  D0 G
6 m' z5 F+ G: A1 T! w
        while(1)) b! Q0 l6 b) S3 C8 z# F7 N6 C5 s# Z
        {
: N2 h% d: m: h, [1 q% U                read_MSG_buffer(mem);
4 G. r  a  r8 L6 a        }               
6 [4 u) R1 }! t; ^  I$ A8 \}
* V- ?7 E$ U5 ]# P2 d. d5 r7 _9 G7 R0 G6 N+ y- H
void read_MSG_buffer(int *baseaddr)
4 b! t+ }+ ~4 z4 X4 c{
% }0 ~4 E. O5 \4 V        pRX_MSG_PROTOCOL pshreRAM = NULL;
. N" g1 u$ g" Q' }8 f2 }  N! y- `* H4 v. ~, d6 ^4 w/ S( b. g
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 ]! l7 ~7 U$ |- a1 j0 v# V8 j- M2 L6 H9 R+ R7 l( `: p7 P% n4 |
        if(pshreRAM->packet_cout != count_copy)
- q. g0 e7 b* U3 P0 A8 }        {
* ?" _# G  [! b: v& U& v                printf("a is %d\n", pshreRAM->a);
: O6 I( b# f" o7 T                printf("b is %d\n", pshreRAM->b);/ }8 R- \+ U$ a. j( U3 ]
                printf("count is %d\n", pshreRAM->packet_cout);' I; I; ]* n' `" m$ M* D) n9 f
                count_copy = pshreRAM->packet_cout;$ p" H" C2 p$ |+ h7 E: q
        }
1 f3 z1 |7 l; @! h+ Y6 E! Y9 t        else
3 c+ D, A# S3 ~. A$ X& W        {
; v2 {) {% z* ^1 b7 y6 d) u                printf("No effective message!\n");; f! u: P9 _0 ]- T+ `
        }8 E( y' I' J3 Z' p7 U& A0 F7 C
}- J/ t8 n( T/ r5 S
& M4 }1 O5 f- n6 U
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' f' B1 k, k, j2 X
$ [) U6 J% p( v0 P; a/ l" f- k& y, {( q1 _5 J( u4 J) f0 |3 W

6 v  a) ]! q' j
9 n: z8 v, D" k6 u& m( r




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