嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( g; p* }2 F: ?, p0 g/ }0 }$ D, W2 R7 K( [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( Z- Z2 V% \; N, G: U! |" j+ S% p#include <unistd.h>
  d6 C  L& ?) b! w# Q% c9 ?#include <sys/mman.h>& \6 ^; r3 m4 W9 `; J7 r+ ?/ }
#include <sys/types.h>. Y) L/ T& i" O8 m& u6 ]8 E, T
#include <fcntl.h>* u9 }4 L; |6 o' u# B, E

. S% A+ G# `0 ?- Q9 _#define SHAER_RAM_BASE_ADDR    (0x80000000)   
" n7 G7 s! t+ l4 C- Z, M3 B1 f% W/ n# e" E" c6 m3 N
typedef struct
$ [; r5 g9 _1 q2 Q+ ^9 c# v{
8 K1 Q: \4 Z0 A        unsigned int a;
, E# o8 m. f6 J: x        unsigned int b;0 Q/ B" `1 X- T8 y+ t* A
        unsigned int packet_cout;1 \- `2 j: v$ |: l& L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 n* @, l4 R, Z
0 p3 z9 O- \4 o* d5 p4 ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! C6 h4 d+ O! |, ]7 E" Q
unsigned int count_copy = 0;
6 `0 k. V8 n9 ]7 G4 z  }7 f. e
% M* r, p  C3 R
) W& G4 A2 c/ q- [. ~int main()
- z$ H9 w- C8 L/ W{
2 H9 `$ W( H# i7 G, e8 P8 C        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 {. r# `  ^5 r        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! V' o+ t& t8 W, S
* T' ], v: z+ s/ C  r9 t        while(1): {& v, }- m  l3 c6 ~- A6 ~" @4 C
        {$ z1 ]9 @# R, w
                read_MSG_buffer(pshreRAM);1 L& d5 h+ e1 y7 v' z$ [0 `: D+ q: O
        }                ; @2 p  r0 F7 I1 g) K
}
! ?& y% M6 N) j. D5 t; g7 }! b% V$ }: N. i3 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! a6 G) B- _8 G, Z; }& [2 T2 Y{! ]5 ]  v! @! a2 a9 X% R! M
        RX_MSG_PROTOCOL buf;
) a# t# f) g% Q/ i, r! ?        9 p# a$ s5 M% `/ P
        buf.a = pshreRAM->a;
; Q0 H/ G% r' q1 ~+ q6 \% v! h7 G        buf.b = pshreRAM->b;  Z  e6 ?/ Y2 y  f1 x2 E3 f! l6 g
        buf.packet_cout = pshreRAM->packet_cout;) j' a1 n! m5 o
        $ k# V+ i& S) H5 j
        if(buf.packet_cout != count_copy)8 ]% u" t" C* M
        {: L# T* R# ~5 l, v- g1 d
                printf("a is %d\n", buf.a);1 R3 ^5 [' C$ K6 d( g$ H" c/ T
                printf("b is %d\n", buf.b);9 u0 d, Q' [' b) [& n
                printf("count is %d\n", buf.packet_cout);
( A8 F1 `( w8 V8 ?1 J                count_copy = buf.packet_cout;
+ N' a0 h0 |) E2 _0 I- I4 p2 C        }; H1 |3 {: i4 x* G' `3 v9 h! g& Y
        else: D5 U8 U0 L2 w& `3 j) T
        {$ l( k3 N' p6 C8 n* E
                printf("No effective message!");
  W; g: m/ X5 L3 x# Z6 O2 M$ D! g( m        }( h% T" ]- ?% A4 Z( x
}
1 }; L& A( Y3 n0 f, }9 s# A: Q# _7 }0 C' R9 E$ j) |
3 H# B, ?, O- h; v6 Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 Y, e4 T& t! n2 o2 R使用下面代码,对内存使用了mmap函数后:
. h: n) L3 }  s! R- m- J" E#include <stdio.h>
9 p: @. |4 n: O: ^/ n* e3 u! e4 }#include <unistd.h>4 U3 ~) b* h% l
#include <sys/mman.h>* `' Z: X$ v% e) S5 p6 ^
#include <sys/types.h>* ^! N8 c1 v2 A6 V8 V1 _
#include <fcntl.h>
- b" o) Y; R  {: [: u( E! e& q
1 N# {8 b# }# g' R#define SHAER_RAM_BASE_ADDR    (0x80000000)+ `: y3 G' H+ j, o4 [5 y( p
#define SHAER_RAM_SIZE         (0x20000)   
+ E) y, `/ F3 `) z- u6 D" l5 S3 t6 q8 U6 b# L7 `: ]2 w! H
typedef struct
, o3 _* z+ Z- G. `6 C) l+ I{
5 z+ R3 Y3 O; x4 J; A8 K4 k        unsigned int a;! L5 c; r4 ^& ?$ a6 Z, I
        unsigned int b;( S3 K. I. k  x! X) B
        unsigned int packet_cout;
" I5 E# m. L6 z$ l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: w$ r* [1 v$ u" z2 s# L- t; h- l  M/ q' E! X$ U" T9 a+ A8 b1 _  ~
void read_MSG_buffer(int *baseaddr);8 Q; N+ a, h. r+ {- N4 z
unsigned int count_copy = 0;5 n0 f" \' A' H; Z
2 }6 u* u3 V. @. P" D
int main()" y  y1 X+ d3 M
{
* e6 d1 b' [2 |' l3 k, l        int fd;" Q5 K% o7 W' U1 k- J/ l: u
        int *mem = NULL;+ ~/ f- S/ `) \/ y) L# Q7 C

2 V* Z2 x; Q! l; w" X        if((fd = open("/dev/mem", O_RDWR)) <0)* {5 o( t8 ^# l, }. z  L
        {' P# c+ j/ J; t/ P. D1 Q
                perror("open error");
$ \# L0 P. w+ G: E% Q* j                return -1;" B  F5 y/ m( M" L- A4 i( l3 S
        }
! c! d( g: {8 F6 a, m0 U' e9 T        
* i/ x9 H* g2 H8 R+ x  K. [        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ R+ `( n! N8 x( r/ I6 ?; P" G  Q9 C" \9 H9 B
        while(1): e2 }) B9 v* T! O& h% E1 c
        {$ h  V' Y: c; j; @2 i5 H  l
                read_MSG_buffer(mem);, C9 k5 j9 _8 V4 y" J
        }                6 }  Z6 g5 K' M6 h
}
8 {+ L- J0 e1 Q- e
" j) g% q; i5 h% K  v, w( ^void read_MSG_buffer(int *baseaddr)
  ?, R; C; G8 ?! C$ B7 e) n, d3 v{
; K; |. @( [6 C8 e  S% G        pRX_MSG_PROTOCOL pshreRAM = NULL;
! @9 ]4 Y  H3 }: @" K" t; c. B2 d! i4 ^
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 X1 F( U, I9 O! x  d2 S
- w8 A1 Y0 [" ~# r; |( _9 ]' Z3 \
        if(pshreRAM->packet_cout != count_copy)
4 x7 {3 L1 w' I4 D  z2 H        {3 g" }; l7 l9 Q
                printf("a is %d\n", pshreRAM->a);
9 g' {8 F- }9 G7 g% S                printf("b is %d\n", pshreRAM->b);) t5 J" a& u0 @, n1 w/ R
                printf("count is %d\n", pshreRAM->packet_cout);
$ g( B' {1 l2 d# M; L# @: V+ y                count_copy = pshreRAM->packet_cout;1 l5 z# R5 Z# r
        }
: O3 ^4 R- y! N* I        else/ I$ f/ S" b5 e( a, b
        {
4 W$ k: n# z1 T& a                printf("No effective message!\n");
& ]9 e+ G5 o$ p! H        }' g' h4 e& ?. [# j
}  j. c0 j6 G, W8 z+ q: H
. e" A0 a% G5 a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' K" P& {1 _( e- L# w9 G
& E0 b$ Z3 E7 M, S

8 j0 c: W# a1 z5 M# ~8 @' a4 H: H
8 K/ F* ?5 Y! |2 _' L. ?* t
" ~4 M- r8 u, F/ m* Q. L/ m




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