嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 K* c7 _# r2 Z- N! T2 b: `

$ j: C! x  L8 P8 C* U& YOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 R2 A$ D6 T( n#include <unistd.h>$ y4 @) w. F5 L- b7 W& Y6 D% d
#include <sys/mman.h>+ E0 s9 c9 B/ P$ s
#include <sys/types.h>
' G; ?7 k, x, D' k! F  c#include <fcntl.h>
' x" v; f/ J& v0 h6 e1 G1 p- ]( n/ S0 Y( f) Z+ Q8 _
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
7 L+ {  ?8 V; p& y3 L
: `- F8 {+ s# b9 g2 V9 dtypedef struct
9 ~; X, q! Q& k! Q* ^# R: t{5 ~3 J  B5 l9 m2 ]: B( y
        unsigned int a;
) B* c9 I/ B0 m" \. p& g* K        unsigned int b;/ u2 \' C8 M! D/ }+ U  K0 Y, u
        unsigned int packet_cout;& H+ z6 h* e4 o3 y! i# D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 h2 H! W" W/ b# u3 R/ R4 W4 q% o; v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: w; U1 v: E5 [( H( @! e; w% K# Yunsigned int count_copy = 0;
) x% `7 f- K# x/ X8 j3 Y
" |( Y5 k! |+ b5 r9 N5 \# X$ r* z
6 o" E. @: Q& b2 Qint main()
3 B, D9 \+ U0 ?1 R{
9 S" y7 @8 F$ U4 y& A& J8 E- B        pRX_MSG_PROTOCOL pshreRAM = NULL;! |! C7 J+ G2 S
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ P8 o* Z5 H" j  x! p0 S* I& ?  [$ l
        while(1)1 x. Z$ p) F4 Y& i. G' x: J( g
        {
" I: T5 O# I( I8 _  h+ W2 S& y                read_MSG_buffer(pshreRAM);
: V2 h6 H" w4 g# ]' a2 d, m        }                5 k7 X; [& y( R
}& v" j! S6 K/ \2 `9 p  U$ ]
( a, I6 y2 T# @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- }( e" b+ `2 N" R0 D0 t" X) O{1 p/ d: x) [* c0 F, R
        RX_MSG_PROTOCOL buf;; C; k/ k! t2 |6 N. W
          P3 @5 w- [6 c0 d: v! G  G
        buf.a = pshreRAM->a;
: \; w- q: v9 C: k        buf.b = pshreRAM->b;
$ U+ a; J# a$ g        buf.packet_cout = pshreRAM->packet_cout;, n+ d" A2 X7 O
        * J; z: H/ H5 W+ V+ w
        if(buf.packet_cout != count_copy)! g" U* m: d3 M, f# q( D
        {
, I. o# x$ r. i% M* L( p8 t! g9 ?                printf("a is %d\n", buf.a);
  a4 ~3 P9 a0 |* N) y8 f9 S: v) P3 e, c                printf("b is %d\n", buf.b);
; U, v  J1 _, G: ~' s' j                printf("count is %d\n", buf.packet_cout);" j7 \1 d* w. E2 ~2 P( h  W
                count_copy = buf.packet_cout;' \, d% f, g, R, ?8 {( y
        }7 p; W  p% P- Y4 S( k% n& U
        else
4 n7 V# C/ |5 e  ?        {
& z( U* P5 G3 y, h                printf("No effective message!");
) Y! b, Y: ]. A+ }: i2 s' Z. ~/ {8 ^, \        }+ I& C4 D: w: c
}
( @- P8 D6 A# n* r
+ O' L* g" [. l' a; I9 R0 R9 N, s, V; K) ~
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 v3 s- I5 X+ B使用下面代码,对内存使用了mmap函数后:
) O* R5 c+ h( _: f$ N* n  [#include <stdio.h>
( w% |& h4 e9 S4 F; Z6 {9 a#include <unistd.h>) C" Y' C) b7 n) j1 _8 V+ \2 m
#include <sys/mman.h>
  q- |6 o4 z; J2 E9 m#include <sys/types.h>
4 P* ?, `) @1 k: W6 M#include <fcntl.h>, j' g. I" W5 H" I( I5 O
; y2 S( X+ o- V( j6 p" |
#define SHAER_RAM_BASE_ADDR    (0x80000000)# w. u* P. h1 Z6 E+ |
#define SHAER_RAM_SIZE         (0x20000)   
- u% g, s' b& H* n+ [% D
1 z% j( ]/ |3 b) }8 a% c. }typedef struct
5 J; A* X7 Y' }8 |4 v( ^{
( g( `9 d7 c- ?7 J& b        unsigned int a;3 G! i8 @! t: T# k6 T
        unsigned int b;* Q8 x' U* v8 z( \3 B0 g5 P! Y
        unsigned int packet_cout;- X8 ^) D2 ]% J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' ]* k! Q3 H5 x
9 c, J/ p7 Y. ]5 M* Pvoid read_MSG_buffer(int *baseaddr);
3 ]/ c2 O8 o0 [( {4 J3 U4 [unsigned int count_copy = 0;
  W& G* O' }* s1 C* N
: n8 s- q+ J! v2 @% E* mint main()
# U) C+ ?0 J% n1 T  B+ I& G{) g5 I0 M5 K* ^. A
        int fd;' [  @1 z! z  |
        int *mem = NULL;2 [  K- a4 F! C# O1 ~' }5 s  |

0 K9 C" {4 V: x5 g        if((fd = open("/dev/mem", O_RDWR)) <0)
& W& y$ w" _. D- h        {
0 E$ r* g0 |% `" h% x( A                perror("open error");
  e; _# e+ v$ Y8 n3 J9 t' f                return -1;
( l" x6 b) y0 H5 e( e" S        }. \; v! I8 G: _
        
1 v: }! X/ T: u5 S8 w        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. n/ K7 `, {8 T* g, H

; I% Y! ]: C+ X# U" S4 u/ K% V        while(1)
: l8 w( ~4 H6 |  u        {& s$ G& \% Z( N& ]1 J
                read_MSG_buffer(mem);  Q$ j& b9 \' l% |: O4 N
        }               
6 b2 [  M' Z2 J$ E  y* Y7 n}* f% d( U1 o) ]& m7 [/ [" ~

: L9 t) Y9 A( x+ e7 rvoid read_MSG_buffer(int *baseaddr)
# t+ Z9 D$ A& o3 o, \{( N& @+ ~8 l& i/ d0 t8 q* i
        pRX_MSG_PROTOCOL pshreRAM = NULL;: e& |% c7 {2 @6 t6 _$ h6 P
* O3 M1 [: d1 y  F2 g8 d
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  D4 d/ C* }0 Q, S
6 B+ J& x4 c' w9 [6 R( g        if(pshreRAM->packet_cout != count_copy)- s. g5 ~) `) u6 ^' X* h4 G
        {( I' S# v8 G; W6 H4 T; f7 a
                printf("a is %d\n", pshreRAM->a);, n- F) Q7 j4 g! z% {) [. Y
                printf("b is %d\n", pshreRAM->b);1 d7 |. W8 ~: p
                printf("count is %d\n", pshreRAM->packet_cout);
% M7 E( x8 V& R( b# a" Y3 ^: K8 N2 {                count_copy = pshreRAM->packet_cout;. H! u, u( B+ }  H
        }
, Z$ |& h7 K) r7 Q        else, n6 B0 z1 I( b  y, ?; l
        {4 b' j* d+ N) M9 x3 R) J
                printf("No effective message!\n");
) l# d0 |- ^& Y9 U% T0 e) t+ }        }
4 B& y1 O2 g: w; y3 T}
1 l5 c. }& R) l, H& g
" e% o$ I; q7 [# X. o没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???" R# C; U5 p) |# Z0 Y  y

# `) a/ G9 X  V; |  A$ E$ `# }1 z6 \9 F  J  i% p4 d4 q
/ T5 H2 b0 B9 Q, \9 \

! }' }6 r3 E. E- z, q+ r0 S




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