嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " @5 `, o& `. i4 `1 H$ k
' Q( @# [/ q- z* c# @9 E
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 b) `+ e4 v2 R0 y5 ^+ U8 R#include <unistd.h>
% x6 K, U+ @6 ]% B, }. ^; Q0 i#include <sys/mman.h>% O) y' A. h. r. a7 j: U: n# s; }
#include <sys/types.h>
) _; X* V, d, b% P* S" `( I#include <fcntl.h>+ i2 j. W4 Y- \" e! O2 o5 K

7 x. K% X1 d& |( @1 N  f+ y5 L/ w1 W& S#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* c: }0 ?6 L, s
% ~- P; w# t/ w' ?9 Itypedef struct
/ \& }/ `" H7 i% S{3 O- ]8 g8 f$ F' J+ `
        unsigned int a;# _: @3 |8 C0 `
        unsigned int b;
& U2 O6 J% C" K' _: U! e& e        unsigned int packet_cout;
3 v2 _1 u4 P) m3 t1 i4 H  }: l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: X$ h, |* y, Y6 F7 |( R) i7 y9 r& n/ a! z6 u1 s. ?/ G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% W6 s; H: a! b$ j; B1 p  B
unsigned int count_copy = 0;% q- r6 b8 t1 f, Y4 l) A. u

% l8 Q9 |  K) p# @3 ?. h4 W; c. K7 m
int main()! b0 T2 i9 t$ B$ N
{
0 \2 d: O  L- w/ I% e        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 V1 |1 O0 h, W        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! e% P! e: D4 g

7 c- Q" T" X6 B& x        while(1)6 D( Y* X4 Q" e4 I5 ?
        {+ x# s& i$ h0 v( ~8 D' a, v# U: i, @/ t' y
                read_MSG_buffer(pshreRAM);
* b; c* o" J" o6 H3 a( F" l        }                6 t( q+ H% h4 m. K5 M
}; M, o. Y; C1 V0 T$ q8 I8 k+ H

3 k+ w& A7 `" l( s  H3 Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 b6 B  G" m* b) C
{# ]1 }& W( y- g
        RX_MSG_PROTOCOL buf;) L$ |4 ^7 l6 |& n
        2 `, l2 n, F1 f. P7 w
        buf.a = pshreRAM->a;6 @" p- t3 `' x2 b/ N( d1 ~" B2 t1 ~
        buf.b = pshreRAM->b;9 I$ q) G1 ]6 W3 q
        buf.packet_cout = pshreRAM->packet_cout;5 P6 M' _/ k2 }1 c
        
% u* n+ O  R# X        if(buf.packet_cout != count_copy)7 h0 x7 a1 ?( A
        {: x8 ^: K3 a8 E# G1 B
                printf("a is %d\n", buf.a);
. {  V5 i0 g( `6 W                printf("b is %d\n", buf.b);6 t; z/ V, P) L$ R+ h: _
                printf("count is %d\n", buf.packet_cout);
* X* c! D2 p, p) A' |. n                count_copy = buf.packet_cout;
' V+ |, H, a' T, C: ~* A        }
$ O4 c9 i. z  O9 f        else; a+ B5 \8 C5 i" g
        {
$ f7 t# y5 ]9 t' O9 Z' k; M! J3 C                printf("No effective message!");
3 ~0 z9 W  |5 m. S        }
: ~" G% A$ k5 T, y: O0 y; U% z}% w; I3 i/ {3 ?& R) L0 ^
5 T& q& o7 n# _0 l

5 k6 d! P3 x1 p3 J! L: m. q但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) D7 ^3 l- }; @7 i) z/ A' x3 G使用下面代码,对内存使用了mmap函数后:
2 ~9 e0 J/ L8 S6 D% I% T#include <stdio.h>
( I+ O; f9 s9 h3 ~* j#include <unistd.h>* q; ], W1 s0 ^* b+ r6 p
#include <sys/mman.h>2 u' F) B$ U4 B
#include <sys/types.h>
1 C9 N2 [/ R# l" P#include <fcntl.h>
+ \! w& u! ?, t/ p9 B! {( X0 I! n2 ~
#define SHAER_RAM_BASE_ADDR    (0x80000000)
0 h$ _) h6 s3 @#define SHAER_RAM_SIZE         (0x20000)   
& y0 A$ v: K+ o: p. }1 |1 U; C
/ r) W* S' n' Z: gtypedef struct$ Q6 t# I/ D" Z9 U
{( H2 W' U3 N: [, L
        unsigned int a;" r4 ^0 _# I3 C+ p
        unsigned int b;
2 ^% J" R3 p2 f2 [4 C7 I1 }        unsigned int packet_cout;
4 [7 |0 p4 ?; X2 Q# z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' Z3 M, F6 P. b
" [' N1 r& u, w
void read_MSG_buffer(int *baseaddr);' H$ O" r' m; v. y; E
unsigned int count_copy = 0;
# D1 i* O9 Q: J/ D6 Q/ R
) H$ R5 c' f9 n+ Y5 H& \1 i+ E1 S4 U  k* Bint main()
& ]2 W1 j8 ^" G) f4 u! l6 M{
7 _# u. t6 J/ r: R% E" R        int fd;9 T- ?8 Q+ w- c  ?0 q' X5 n1 e
        int *mem = NULL;
) _; V6 l' `& |5 C( X1 |" M
; Y9 ~) g* ?! A$ ~        if((fd = open("/dev/mem", O_RDWR)) <0)3 M; o: G: Q, {$ b4 {
        {
2 s1 r& H$ O- z, s                perror("open error");, I9 c% p: w7 V: ]/ T& s( {
                return -1;1 O  X# `% x6 Q
        }
( j6 L: l3 M3 W; T: U7 c7 F  }- F        + X' _3 g  p( l1 X
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- L2 O- y9 P+ t9 e% K

% B1 H3 q, ~* l7 Z: h7 f& \7 ~3 E        while(1)
# b& w" D8 _% e& C$ x8 d! Q        {
7 b1 |: K; k  ]5 G9 r                read_MSG_buffer(mem);
8 G7 T9 \+ ^( [7 f" ^1 K        }                % L( W' ~9 y, h4 N$ [
}, B& t( Q  O- l9 x2 M
' E' T. z: s3 X! @
void read_MSG_buffer(int *baseaddr)
6 w' {3 S5 Z( d; Z{% b5 S' v* Y/ _& {/ Q
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# U$ F, B9 R& X; k' r/ z6 D" a* z$ O$ M# y, z9 \) S
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ J9 ~6 J0 d7 i& Y
7 g3 g. X$ g- |# ~9 F  H/ e, V0 M
        if(pshreRAM->packet_cout != count_copy)
& }7 A8 w7 g. F+ Q0 d. _% X* a# K        {0 z% _- S0 |4 y
                printf("a is %d\n", pshreRAM->a);
3 f' R' z4 F1 m4 K) w* R; R. W                printf("b is %d\n", pshreRAM->b);
: v' k: w1 X: K                printf("count is %d\n", pshreRAM->packet_cout);5 _" A: M9 W3 [' `4 f- Q
                count_copy = pshreRAM->packet_cout;
- T7 Q' n7 K( e) T7 {        }+ A2 e- G' M" q0 G( z) v. U
        else2 Q( e+ Z0 I( M* ]! y8 Z: T9 R6 `2 Y
        {
$ \$ z2 f; B6 |6 \+ h- [                printf("No effective message!\n");
1 X3 }6 ^5 G+ j0 v9 I        }; c/ q$ g+ S' G0 A) C
}
, g7 w3 F( l7 P6 w9 X! S" H+ P- t1 a1 u
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, g8 M& m5 Z" n) j2 ?. S4 C

" W* ?9 K* L: b+ Y. u* g* H, u- ^) e6 x2 d" v

- ?: H) N) a$ B6 B3 z& y9 b- G
/ s& C# J: ?) |- g! ?4 h1 C




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