嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 v: D+ v/ \8 T) Y" k
! I. m( ?/ Z* [$ c& P6 P5 v. XOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- q& }8 s) v2 s4 ]9 d7 S
#include <unistd.h>/ S4 N: z6 J) h8 S7 \: ~9 |$ J
#include <sys/mman.h>7 l7 {4 e- O" G! K, E3 Y# b- o3 g
#include <sys/types.h>
+ t5 B# D6 x( h, l' Q#include <fcntl.h>
* w5 N+ r+ }0 {& ]6 W, L" n( [; }  _7 ?/ {
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
2 x- q2 c& v  L8 B- _" z/ z4 R! |$ ~0 S& A
typedef struct
' f2 r5 n) y- |- ~) u0 i( ~( c$ R; S{
3 }, ]8 [0 K( w8 i+ z3 W$ _        unsigned int a;
# x+ V* [5 ~" j, L        unsigned int b;
6 `& K) W/ M0 h- f0 U        unsigned int packet_cout;
- ~4 ?1 `- k6 b/ J& P# z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ A) Y' p0 s  k  W2 \3 X1 K. l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 V5 y! Y4 ~: Dunsigned int count_copy = 0;* U: Z7 `% U$ G# T( a+ U0 u

  ]+ d" _- l! F0 b1 h4 [' j
' O2 ?3 K, l3 _( G! x+ |7 J# gint main()
& H/ J8 m* U( i1 p6 P{
( u" K% f0 ?* s0 j6 u  w1 P3 Q        pRX_MSG_PROTOCOL pshreRAM = NULL;
! c( R8 q3 R+ t  t        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;4 e5 ]0 k6 E; y; @% A3 I( b
% G* O% c4 M3 S7 s6 E
        while(1)
& m6 c2 M3 K3 X5 J( Q        {
, X0 w; g( M% Y7 F" R+ u                read_MSG_buffer(pshreRAM);* S, p6 {1 f# [
        }                4 m& [: R1 W8 j, ?, k
}- R; d0 w7 P0 y" b! k  \1 `

* \9 ?1 Z% j9 m- j4 n$ ]- I. ]void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" ?$ }# u5 o& g
{6 Q+ f6 w6 Y0 m
        RX_MSG_PROTOCOL buf;8 o) Q7 ]3 Z2 I2 e# f$ P
        ' Y/ S1 m9 K5 C8 i" X
        buf.a = pshreRAM->a;
+ E) i. `9 a# d1 p        buf.b = pshreRAM->b;8 P$ _' o2 W- a
        buf.packet_cout = pshreRAM->packet_cout;- q* J& [3 v: g: A
        ; ^. J* d) `, D/ {0 a8 b, x8 L
        if(buf.packet_cout != count_copy)
8 J1 p1 {+ v0 ^+ K* }# g        {
3 D- `) Z4 h3 x. m5 V, @                printf("a is %d\n", buf.a);; [; }' S# L5 ~! D* r
                printf("b is %d\n", buf.b);
' E$ H+ f6 R( X2 i                printf("count is %d\n", buf.packet_cout);
% F1 z4 \% D3 Y! n% c5 ]                count_copy = buf.packet_cout;
6 C7 ~  M6 N* k3 s8 b# }' x        }
; l% Q& a) U' _. w; f/ R  k        else' Q( ~9 `* ?  h' @2 Y
        {5 e+ x& A) i- R/ Z+ `  D
                printf("No effective message!");
7 P! L5 o( T/ N: c2 E( d        }
& V; k! S5 K* a6 k/ n9 q. e3 p' g}$ U4 L3 u3 \- Z' e1 b8 n

1 G0 k1 r7 }- {. b+ h( P$ P
/ |  E  Q0 @, {: M# h/ r, n( X但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# T$ Z7 B8 g; f( Y1 t: g' P
使用下面代码,对内存使用了mmap函数后:
9 D" ]1 V# @" I$ X1 C3 W#include <stdio.h>
" ^6 }6 e9 P. B6 s#include <unistd.h>
" g" }, Y$ m& `; i; _5 G: Y#include <sys/mman.h># l- }' p  u! x% F
#include <sys/types.h>
) Y7 N6 o, C; x9 [: N. r: n9 j0 D#include <fcntl.h>
) H4 w. ~: H- p, V
" _7 U  y7 h8 f6 R$ C& L% Q1 C#define SHAER_RAM_BASE_ADDR    (0x80000000)
/ z; n6 p1 {- G9 Y' Q, g9 l: z#define SHAER_RAM_SIZE         (0x20000)   
- G3 C2 g: u, A; {# c4 c. Y% z9 C
# N# g" L* E& Q+ T  Ytypedef struct6 _) k; v1 t' V2 Y2 @# c% y' a
{
4 m. B/ s/ }% a- }" U) Y        unsigned int a;
4 k& }$ o9 d7 [+ g1 h        unsigned int b;
2 H. \% A6 Q: I3 z7 r, k        unsigned int packet_cout;
+ v" Q" z0 ]6 V, J+ s# L6 g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! w3 b# c) \8 P

! a- m) [# x' r' e, C4 Z2 x8 wvoid read_MSG_buffer(int *baseaddr);
+ n3 f4 f6 N# e/ b+ W' O% dunsigned int count_copy = 0;; m1 K/ e4 I" z7 s' E# w, R4 F: e

3 N; E! A# O/ [- C. Gint main()
( ?* f. s6 D4 d$ Z{: {# J2 e% o* h8 M! I% R
        int fd;
, E/ F6 B. u9 [1 \+ R0 Y        int *mem = NULL;
7 ^6 m  H  p" I; I  L9 j& ?9 V" X- L& T& ?$ V) N. m  v% o/ H( g" K
        if((fd = open("/dev/mem", O_RDWR)) <0): i7 W5 k! B! G7 p$ E' A" K5 H
        {
7 V$ W0 l9 g( b- u                perror("open error");" c, _$ ]  P0 z$ y4 l- d+ _6 l
                return -1;
, d* M* M7 C  X0 s$ k3 |$ f        }
$ \! L8 }7 v" r) K. E0 E; ^1 Q- ]        
* j' P% \8 }7 O. N) q! A" c6 V        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 p5 u& b) y2 \# k
! n# h1 g1 s5 I5 T        while(1)
7 k' V9 k) H, M8 S9 D0 S% H4 ]        {
7 B, Z- J0 I# Z  y                read_MSG_buffer(mem);3 _- w( y, Z+ ^( t" i$ ^- Z2 w# m& _
        }               
2 C; `; Y* f' }) S& b: t}( ]* W1 G$ q  k

! r$ Z. u  }) Z  W8 v' O) xvoid read_MSG_buffer(int *baseaddr)
4 s, n1 D8 p  ?1 B{
2 v3 \4 ~9 [4 H1 ^) S9 {  F* [        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 I+ |; ^% }1 ?, x2 {. w, Y% T) |+ ^2 G9 Z2 V
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 e( i- b$ {4 p$ [9 M1 [0 v
: h) \3 G% Y) N3 u5 ]        if(pshreRAM->packet_cout != count_copy)9 v9 `! k- t8 @
        {
7 y9 d& N4 f0 N- ~                printf("a is %d\n", pshreRAM->a);
& I7 l+ L2 p  {& g$ `9 c                printf("b is %d\n", pshreRAM->b);# h% {/ r' w4 S9 W
                printf("count is %d\n", pshreRAM->packet_cout);
8 V  o( C8 M9 f7 R6 A6 Y. D6 L4 P                count_copy = pshreRAM->packet_cout;& Y) {) H8 p2 g5 w! T2 @4 W9 P
        }/ D0 Z  F6 g3 r3 O* H/ m+ Z
        else! w& s6 D& K% M  E
        {" ]0 \. O5 S' Z0 s; V! S, p
                printf("No effective message!\n");
! v: u& }7 U$ E( ~' l7 }$ v  i        }
% `7 c7 N1 U2 G) b3 L}9 V+ k4 A+ D5 ]+ T

7 Q+ o2 ?. e3 x) _/ Y* |4 y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& v" j9 S! p- d0 W6 P% H
  H2 L! a: i3 ^& S" l

) g3 T! Y) g- z7 {; u7 F7 Z5 M6 k& p$ P! z

0 J  [4 l1 p6 U9 D' ?7 s5 Y/ J  n




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