嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * B2 g/ W. y: X! P
7 _* \  `" _( e  I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 Q. P* C9 ~' m
#include <unistd.h>
( W- m1 p- b4 ~- v#include <sys/mman.h>1 ^6 C  Q  R7 y# x( W6 J5 u
#include <sys/types.h>, m# B6 q( U% j2 B: v
#include <fcntl.h>
( P( U; P* N8 g
4 V+ w) A9 E& r3 ~3 B#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* }. k  O' N0 k( R  E
, a3 y0 {2 G; W3 w! v6 _) vtypedef struct& G: F* V# t7 Y6 Y
{. V0 C2 F9 Y0 g6 e5 ~
        unsigned int a;
: [4 J2 Z) R, P0 |0 d8 R        unsigned int b;/ V( C7 t0 Z. r1 n  [( c: C
        unsigned int packet_cout;$ h/ P" C( p: x9 R- W7 S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! D0 u1 b+ k/ K$ I8 C) G# |" ^

3 C' A  J, e. f- jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 X+ D: q% ?* d/ T- \8 _/ H7 g3 hunsigned int count_copy = 0;4 r( V4 \$ F2 g5 m( ]" B9 q

+ P) i8 D) d7 C% f+ b1 T
/ N% v( c$ b: ]" g8 Z. fint main()" m. J6 k2 W4 q. X4 l
{! Z- q& i- m1 a7 O( I" r' y
        pRX_MSG_PROTOCOL pshreRAM = NULL;( s+ C& J! S( t$ }5 M
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; a9 `5 c8 D% j: y( [1 ^0 H( N
! T; s1 z- i9 {5 K        while(1)5 n* e& b. @* R! v3 O' R" A! }4 k* d
        {
! x, S9 @$ G! E, n' e, J6 T" {                read_MSG_buffer(pshreRAM);
5 q6 X1 R( {7 t2 g# o1 a+ \% g        }                % `6 A; y9 c2 `
}: w& O4 ^5 s' D- l* _! U
9 I$ F5 D* h! Y+ k" t* c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" u; E: s! o$ @
{$ R7 X; }- C. R/ V% Y6 O0 ]9 `
        RX_MSG_PROTOCOL buf;
5 X3 w" r8 F; O) f5 u9 ^        7 j1 i( l: W1 ]& t; _
        buf.a = pshreRAM->a;5 H2 X3 d6 F1 E. z( F
        buf.b = pshreRAM->b;. j0 [( m& s3 y8 i; p
        buf.packet_cout = pshreRAM->packet_cout;
5 B# n8 q2 O) f! S        
  S0 _& s* E, P9 K' T        if(buf.packet_cout != count_copy): p3 W4 O. @# X& t  w) W& y
        {5 `' x2 g5 K! N4 |7 ~1 q) s
                printf("a is %d\n", buf.a);
' X! O% _& Q9 O3 B# r2 F                printf("b is %d\n", buf.b);
" q$ N5 K! v1 M0 p' m% J" z$ _                printf("count is %d\n", buf.packet_cout);
% O  O% ?& ^) P; |" ^                count_copy = buf.packet_cout;' U( e- W* B3 e9 Z# H2 U; l( m2 U* Z
        }+ s) S6 H' V0 Z# y( ~
        else& m* K% S" O, [
        {5 }% I9 ^( m/ t$ l& s
                printf("No effective message!");
/ f; W9 [- [9 r! h9 Z: e. `$ W0 G        }$ K4 z' A- {" @* w2 g
}% g' \5 `8 o" I# u
. d" Z1 a5 B) S9 ~! T# u
) R+ ~% R0 e2 m( q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) Y2 t: |; ^/ |( p, o使用下面代码,对内存使用了mmap函数后:
5 H9 p, R6 n0 O* x#include <stdio.h>
+ p9 N/ ~( X! X1 R6 p5 G$ U# X6 @3 R#include <unistd.h>2 R" a* C1 L& f  U3 S2 [( h
#include <sys/mman.h>6 ~8 x8 \1 }- q9 X
#include <sys/types.h>
* s0 y7 o0 Y7 R9 L! m6 l! K* B* s2 N#include <fcntl.h>
& Q" ]3 l- S- p3 e
- o% P; \1 z  I" [# K5 l#define SHAER_RAM_BASE_ADDR    (0x80000000)
5 M5 ~( M0 q, P" S+ U$ A4 |#define SHAER_RAM_SIZE         (0x20000)   . x% ^: u# r! t2 S: Y. Q

- u% Q1 D& N! d' O3 u7 f# Itypedef struct
' @* p* ~* l% f, n$ h{/ B# s$ }8 `/ Q0 G& S
        unsigned int a;
* M- l& {5 E+ m8 s# l        unsigned int b;! e. H/ }4 {4 G3 D, c. r! h1 e
        unsigned int packet_cout;
9 K. x% Y! p  G3 c# ~! m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* G! g) E! l8 m3 q* c

8 x; q. [4 F2 n& y- b7 _void read_MSG_buffer(int *baseaddr);
6 y7 N. }, R8 t% }. z! F; {+ Yunsigned int count_copy = 0;, W6 k9 E' J/ j/ @/ T$ T

/ I$ c& t5 Y, p3 o8 G# A8 sint main()
! c! y6 P2 i5 ]) i8 G( b; T. o{$ Q. u. M3 e( H8 @+ B( c: }+ x
        int fd;- m; k6 s0 [1 E' \- |  d; O
        int *mem = NULL;+ B4 d. Y8 R: {) W- Z9 Q% A
5 S' U& M" d; o' d9 \) n1 @
        if((fd = open("/dev/mem", O_RDWR)) <0)
& u- {' o, c5 t8 S+ x0 p        {, K: j# c2 n8 l' X3 v
                perror("open error");
! K/ O! `* R! Y  p5 h; {/ O                return -1;
5 f5 W0 C/ M* Z2 @! O9 L! M) `        }4 k/ Y0 A9 w7 {& f* y
        
  f/ R4 q5 n. U& W1 H        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 H3 M6 ^$ Q# V% U5 }: l) `" i  j8 T9 A3 X  X1 ]. z
        while(1)$ f0 s4 x# N1 C* o! V) D9 }3 ]
        {
! i9 p# l+ A& ?9 V6 x7 b8 {( h                read_MSG_buffer(mem);( b: R* C5 e# a8 S' z3 H7 ]
        }                0 R* t. R6 N% X1 w1 P3 v
}
6 f: ^; {/ _* k# K! h7 x; G/ _" o' q+ {; H" }) w
void read_MSG_buffer(int *baseaddr)
+ F, S* \/ \& E) M# H{
* ?' [9 M# ?, _4 K( g$ b# a        pRX_MSG_PROTOCOL pshreRAM = NULL;. E5 [5 E! e4 E5 [
9 S3 f5 v& W5 y( b1 I$ o: @
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 X5 X# Q& x) |0 {: B. E; R; v/ e% b8 K
        if(pshreRAM->packet_cout != count_copy)
1 V+ k( Q3 D  H4 y; ]        {1 T) j! R/ R4 N  q# [/ M
                printf("a is %d\n", pshreRAM->a);$ S2 O: F" Y$ N; U" W) w4 ]
                printf("b is %d\n", pshreRAM->b);
3 q' I3 w1 q$ k                printf("count is %d\n", pshreRAM->packet_cout);( {# W+ ?7 x4 B3 c
                count_copy = pshreRAM->packet_cout;# U5 p. i) F% Y, j- g# e
        }
* p$ ~+ ^9 c8 h$ ^$ b$ y: B        else% Q7 _2 v; O7 R; f9 r( ~' f4 b
        {
0 N' [( F9 u/ z" e* [8 w                printf("No effective message!\n");
; \1 W/ z" Y0 i: r. U: C' u        }0 T9 J8 l" H8 y2 g& D# k9 V* B) c
}
$ ~1 \9 Q% v, x: L  N! O5 `0 i0 s$ Y" D/ n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. K2 [8 T; ?; g/ l. i% J

9 o% ?2 X4 l4 _( n: y- |
& f! S/ q& n8 x; u' r
) h7 h! U6 e5 ?0 n5 {& E# [; r& h" R  w+ j- o





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