嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 Z- A! ~9 h- }7 o

5 @) C$ O: h+ t# _1 a) GOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ m* `' w& B4 ]/ x* E8 E  r/ I#include <unistd.h>
4 v0 Z/ B; i$ X( R#include <sys/mman.h>  E" G7 O. z( I$ }% p  \8 M
#include <sys/types.h>
/ {7 S5 a2 k: ~" i8 ~6 }. Z#include <fcntl.h>
8 Y9 s8 N; r" s6 R" G" Y  x5 }& \3 N! G# }
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
. }" I4 u. ^8 u3 }1 k
. R9 ^* T% T" c5 E1 stypedef struct: q7 [. K$ U/ b  ]& R
{, R% i+ k2 m* A" Q% o+ \$ H6 l
        unsigned int a;
- p' b  s& G( o# Y7 z7 v        unsigned int b;6 d+ F+ L. e' h% F0 }0 l/ y
        unsigned int packet_cout;
$ Q. P5 ^  ?4 R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ f# p6 G# V+ @+ p$ c+ X
* Q6 [' e4 p  {  @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' K( G7 b0 c# }5 ^' L  u: m
unsigned int count_copy = 0;
  o! Y7 [9 p5 u; m
+ A- W5 |$ b7 `; l$ d. ]$ P0 T$ a( m
int main()
% B! |4 n2 i! |, p0 `{
3 E7 j* l$ T+ n        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 j4 Q/ O: d" p0 R+ x5 y        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( q* n8 q: R& F" I. ?- u% F) w1 K" a0 o4 C1 ^3 `
        while(1)% q9 ^1 A8 B$ K4 d+ G
        {  {  n! i& _6 o  V) M3 P
                read_MSG_buffer(pshreRAM);
+ R1 V( x# A. F! y& @6 h        }               
$ l' l* y3 V4 U}
0 E- l9 T. o9 R6 g% a; ~; x- Q
# v2 J* e) o( }- z* x/ Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* D8 Z' _4 f: L- _+ W
{
/ @5 q  M# B% [) E% s5 i! M        RX_MSG_PROTOCOL buf;3 J" A6 A  C$ u& e/ b5 G; i
        
( k. h2 _$ o1 Y! {, t% Q: x# }        buf.a = pshreRAM->a;
" V  M) f' F4 {* q' e8 O+ E        buf.b = pshreRAM->b;
. l+ Z" ]2 z1 j: g' B4 r        buf.packet_cout = pshreRAM->packet_cout;. k/ Z( C$ w; ~2 W! y3 O$ _3 W9 l
        
  ~* |7 b+ s! I/ Q& r        if(buf.packet_cout != count_copy)( t4 |4 _7 p' h9 l) ?
        {5 o  i% S# n* Z9 R4 C4 b
                printf("a is %d\n", buf.a);5 v: U5 m  F  n5 G; B! H0 x
                printf("b is %d\n", buf.b);
- [- l. @1 l( l& _" b" _                printf("count is %d\n", buf.packet_cout);
0 G1 f' J( U* n! I! L7 Q+ B                count_copy = buf.packet_cout;; g6 G4 v9 t: Q8 M! B5 }. v
        }
& U0 `5 Y1 L  L        else! T1 d% r8 Q/ f& J
        {
; W% Z/ [6 K% I  ~/ l                printf("No effective message!");
8 f2 H4 Z+ D9 ^2 n0 A2 _        }
' [& W" T! ^$ j. w- f: O( I2 u}5 [. k4 F" n/ G4 m& n4 l; e0 k

, s+ y) H$ O$ x' K* t8 _
. p2 |( ?' d/ g: P7 }9 K/ D4 P但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& ?1 i+ ^2 V0 A" C使用下面代码,对内存使用了mmap函数后:
' m+ z  a( \3 M5 b$ Z#include <stdio.h>+ Q$ A" D" |9 a
#include <unistd.h>
* {. L( Y1 j/ k; N#include <sys/mman.h>: m2 g3 a# v9 x$ v
#include <sys/types.h>
3 n8 S% c  J  H#include <fcntl.h>/ j/ i' j$ w. u3 @- ^
$ D( c- L1 ~7 U; m7 i, x1 M
#define SHAER_RAM_BASE_ADDR    (0x80000000); [( j! q% e& B4 c( A5 B
#define SHAER_RAM_SIZE         (0x20000)   : Q1 p1 l7 |& b1 P

* y: [+ E! U0 Q! z& |typedef struct' @+ e% L1 j3 \1 m: J
{
! H' l2 Z3 S$ g1 B0 n* ]        unsigned int a;& g  c9 \8 `* M/ \6 A
        unsigned int b;1 T. n" G; w0 k6 T2 \; e
        unsigned int packet_cout;, }. M# v$ T( K3 j" m0 \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' z  M, h' _4 ^' c: r+ C; F

" e) ^$ V8 h$ Y1 h& I0 S3 |) e' kvoid read_MSG_buffer(int *baseaddr);$ z% L' ]; J% m# a+ l7 b5 |2 t0 j1 w
unsigned int count_copy = 0;
0 a9 e+ L  d8 M& m5 {2 F
+ i+ ~0 T3 O- E' |# R5 U+ yint main()
) y; A% h/ a# n3 r# E1 n7 F{
9 `$ U  P1 F, ?0 O0 e        int fd;
: K/ o% L8 e' }( |4 l  M6 F        int *mem = NULL;
& ~0 t- r3 m: W0 f, |- P
" \3 F, o3 W7 E0 ?1 {8 r9 [  \        if((fd = open("/dev/mem", O_RDWR)) <0)
7 M# w. n1 I/ y        {, i8 j& Q, M- y
                perror("open error");7 p% V3 M8 F/ |/ G6 j8 o( {$ q
                return -1;
. z' g" j/ [& e0 N- p. w6 s        }; h& R/ \  F/ {! S# C2 Z
        4 Y" f) ^" \5 x# T$ F
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 }$ L8 N% e+ s4 ]6 v9 O7 P/ o

  k+ y* x- l. ]$ f        while(1)1 _2 d, `* x$ k; M
        {9 l9 V" l/ D" U- n" ]
                read_MSG_buffer(mem);
8 h( o& o6 g# P' D9 T        }               
: D) s* W. a% [5 l6 j}) c, H' r# c: T4 p0 e& {

' L+ Q. c& ?: @: |void read_MSG_buffer(int *baseaddr)
3 t0 g( L. f: ?- y$ r% i{
2 I4 Z( A( f: B3 g# w        pRX_MSG_PROTOCOL pshreRAM = NULL;' g, U8 C2 z8 m2 J
5 l" j1 k9 n: k6 Y' ^9 P7 J
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; A' A5 |7 m! W9 `! k8 O
! q! k- A( P6 K, T1 v0 B2 O6 U4 v- i
        if(pshreRAM->packet_cout != count_copy)5 k* ?5 a1 `9 J$ I" X6 s8 x
        {( m( S" q4 r: D% e. z
                printf("a is %d\n", pshreRAM->a);* Y2 z# h, h( _. {# E9 \
                printf("b is %d\n", pshreRAM->b);
: m# L: l0 A+ F9 N! O                printf("count is %d\n", pshreRAM->packet_cout);" w3 R) {& r; j. v# B
                count_copy = pshreRAM->packet_cout;
7 P( |5 b8 f; ]& k        }
, c( G2 A5 C9 x  U# ~9 i* p        else
) L8 q! s: T/ ?        {
& N* o. n3 e( v/ b2 \                printf("No effective message!\n");
; U3 A) @6 f$ O1 F" r        }' f2 ^) H% F7 a" i9 ]% z& s8 s
}
" s: v' k: W1 _5 V1 Q( E
9 C" m: k3 U  \没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ ]; d  K+ @% ]1 m  y  N( }  ?8 s! l, ?2 g

6 y$ a1 z+ X0 J  v  |3 N" M# c5 S+ D( D3 i

  X) o0 K5 ~$ F0 A1 T" j8 Q2 T




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