嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 m: k; L9 V( U4 N2 e

2 C0 _9 ]; T: p* I: q3 eOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 b' D; t/ O$ Z7 }# n: z! |  N
#include <unistd.h>
! x! }, O8 y6 m6 Q8 Q: a; J#include <sys/mman.h>5 m. u, h3 u  p4 @9 c
#include <sys/types.h>: c! R6 W* W: F( J5 J5 I* S/ b
#include <fcntl.h>; d+ F0 m7 M+ J- l. f, W

& H& q) L& j! h0 \( f+ X( |#define SHAER_RAM_BASE_ADDR    (0x80000000)   
" ^: s2 x. e" V
7 d/ y3 W) ?+ c% {6 Z5 Ltypedef struct* J- F+ Z; Z1 w5 S+ ]
{
# L4 I1 q3 A  [  g( ^2 l        unsigned int a;
1 m" w+ ?3 z/ b8 J' U* ~% o8 }4 C        unsigned int b;
3 g5 G. l# o( T  {. ^1 M+ l        unsigned int packet_cout;. Y0 X5 J6 [8 Z/ u/ |9 }  n9 H+ l* l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 F% a  U1 M& q8 f
4 V# g2 t4 ^6 ^4 }3 B8 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ u- V* q& ^+ c* Sunsigned int count_copy = 0;
; p" e  h7 V* ?7 Q! `
; Y8 W7 S" {7 j0 q) t0 D' ]( U+ J7 t# d, _2 s0 X& H
int main()
* x  l2 i# q0 {8 F( ]{
( P0 c9 j) _: G9 m. X        pRX_MSG_PROTOCOL pshreRAM = NULL;
* o4 i- f) r2 I6 J) h$ }% C3 @        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 Z( t1 ?( q' _' {4 v+ B. @% J6 n, }$ x% d% y0 F
        while(1)6 D, d) D9 r$ l  ]
        {
/ Q9 ?3 X% \! x. R6 S+ Y- }( b                read_MSG_buffer(pshreRAM);
3 ]5 a7 f2 ?; t" u1 ^        }               
/ Y6 y- W5 a$ ^. \  M}
% X/ b1 W5 t" Z  ^0 p
4 y1 M) B2 B9 Y/ `# \void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ `" o9 m( ]7 o/ }% q
{
! ^+ l, ?& {  p        RX_MSG_PROTOCOL buf;
; n5 a* s) v4 E' Q        
4 W) K. s9 U" D, [; w+ Z. ?, |        buf.a = pshreRAM->a;; S$ T$ v1 X3 ]
        buf.b = pshreRAM->b;9 ?6 g' Z2 }2 o$ D
        buf.packet_cout = pshreRAM->packet_cout;
$ ?; W; B+ s, S        
$ r7 u# X; n6 A9 x8 _: d. @        if(buf.packet_cout != count_copy)5 @( X/ x  Q/ n% u5 |& m
        {* J2 g: D7 t( y' f
                printf("a is %d\n", buf.a);0 ~' b0 H3 v$ _- Z! E0 b2 m. {0 _7 n
                printf("b is %d\n", buf.b);7 c$ ]  G5 a9 h. w- K( o( A
                printf("count is %d\n", buf.packet_cout);4 `* H1 `: o  L; c% S  K
                count_copy = buf.packet_cout;6 [- n( Z: I( \
        }
4 m( D0 l$ ~, `/ m  |& ^" o- {: x- a        else
1 N# h- n5 B% b( W$ |; C. u        {
5 ~) V: {( L9 K2 f0 \: ^0 X                printf("No effective message!");
3 Y: Q& Z) D+ R        }
1 @1 I$ K; m9 F  F. G}/ F  P" ?2 r8 H1 m: _7 l

! q) N3 K. p8 c0 B5 O. I
: X( N& }. y# J3 ~" s. u但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: D; q3 k4 m( U! [+ f
使用下面代码,对内存使用了mmap函数后:
/ u( ]1 ~3 p7 K0 e7 Z6 ~#include <stdio.h>! o  I6 \0 s% W9 l+ f" M5 }: \) m
#include <unistd.h>" I3 g5 o3 u* @+ a% J
#include <sys/mman.h>; ~- ]0 V5 Z& P( A, n  |* `4 u
#include <sys/types.h>
! i4 h; W( Z/ m#include <fcntl.h>
* ]: R  F& y8 Q0 Z' J" ~5 m% r* i8 ?6 O9 L4 b
#define SHAER_RAM_BASE_ADDR    (0x80000000)
1 ?6 v  v3 X$ R5 ~0 X; i* |#define SHAER_RAM_SIZE         (0x20000)   / y3 F' q* C( A. p+ ^" z$ U, Y9 `
- @5 [* K6 g3 t$ G
typedef struct
, r- P7 e: i2 Z( h0 z' V{. Q6 w* b7 ?  ^7 [
        unsigned int a;
; f  ~  R, @" W/ W# R" H+ [        unsigned int b;
. e& ~8 v/ U( C7 q) k1 W        unsigned int packet_cout;
7 ?* x" P! s: I2 j, i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- V5 P( f2 M& Q; _% f' x
( |) \$ p9 E7 N& q' P
void read_MSG_buffer(int *baseaddr);% V" _9 I$ z8 P! Z. I( w' N$ w
unsigned int count_copy = 0;
. y, L  ~1 b4 n% x
5 O! T" `, x6 N" \$ uint main()7 o2 `3 F7 C  O: l% Z1 t0 y
{  d  T+ w3 j- W* O& i) Q
        int fd;/ W; R% _) \( J1 J
        int *mem = NULL;
7 o8 B, w7 k' G5 C& w+ P& i6 q* Y+ J+ g, S" [8 L. ?- c
        if((fd = open("/dev/mem", O_RDWR)) <0)1 |# s  i2 Z9 {7 [+ B
        {
% i" J: V8 z$ H  e" N                perror("open error");/ G0 T; R& A3 Z1 c
                return -1;6 v+ t* g) Q+ y+ N2 }
        }
3 k& Z/ C4 G: z3 N; l8 `* U" U        
9 k3 Q4 L- P. d6 G+ s" c        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 J6 f" L3 F! f5 s( X/ @. i% B5 |
0 f0 j8 p# ^6 Y7 H5 D% |% u! G% \; R        while(1)
$ K: P" g7 w: q0 \: H6 w- h6 i        {
5 N# s# f7 P4 I, u% F                read_MSG_buffer(mem);
, L. o: {  q7 s) x. {        }                ( q8 n+ q' ]1 m: @3 @2 ^6 e( A
}
$ q) D: R! J' P7 p! I0 l
8 m0 e5 a' u8 l# t% a+ D: _void read_MSG_buffer(int *baseaddr)# Z/ S; v  W! o+ F1 U) t
{# u' D' i' i: @% Y( k6 D
        pRX_MSG_PROTOCOL pshreRAM = NULL;# j$ c9 w4 ~  c+ B0 J

+ B* h" q4 h& ~" n" t4 ^/ W        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 B7 g& g0 M, s* n
. U/ c/ x/ f( S* F% \$ y
        if(pshreRAM->packet_cout != count_copy)3 E  [+ |5 H5 I, Y+ D9 @
        {
& x8 d' }' l9 D" \* q                printf("a is %d\n", pshreRAM->a);
: s2 w: Q1 {7 q. [! A                printf("b is %d\n", pshreRAM->b);
$ Y$ z' A- H" ?4 `6 L                printf("count is %d\n", pshreRAM->packet_cout);! a7 d/ l) @# i; X$ U& e) v
                count_copy = pshreRAM->packet_cout;
' o: J6 u. o+ ]8 u; ^        }1 T( Z4 r& d/ B' D1 X7 `- \! j( o
        else  W1 R3 b' n, Q) h1 o2 }" p' t6 \1 A
        {& ]+ ^$ n3 ?3 v) d
                printf("No effective message!\n");
% t# l& N0 C& e  @2 ~- e" i0 ^        }; H  z7 {( Q, d7 z: ~% l
}; a0 r% }- N% y  d- L3 `1 o

  B6 m6 K3 m. a) Y0 L; j( N没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& L% k6 E. D4 G
- x3 e( `) Q. q7 K' v

& {. _) P' o$ L* I/ H2 U
& ~  u. H$ T7 x  J7 ^, T# y
; s6 P* }1 \0 G* [0 u5 S' g




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