嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& H$ ]% k$ L# K% Z
4 M" q! i- y" {  T& e* p2 dOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 N& `5 p2 V3 a$ C' P' P: E#include <unistd.h>) O0 F" G+ D* }, A8 [
#include <sys/mman.h>
( c* z8 ]9 X7 _. e& O# h#include <sys/types.h>
8 D, o% U* w4 |9 U/ n#include <fcntl.h>" g- Y- ~$ _' Z* U6 u: H. |+ D
% J' G& g1 P3 S
#define SHAER_RAM_BASE_ADDR    (0x80000000)   4 ]8 w2 m- @0 h% n8 r: e

4 N) N/ u2 l" G) Mtypedef struct
% \7 l* x: ~/ E1 N1 B2 A{( x2 E. A/ B6 c$ V( f' h' R& L
        unsigned int a;
6 E! [- C: s7 s. N, z& ]/ {        unsigned int b;$ s- V( {, j2 T: Z- R8 @: g
        unsigned int packet_cout;/ ~6 r, h( U+ I& Y2 E2 q4 _" F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 X9 Q' p; |! F; |! i
2 Q3 P* t" `: \! D( Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# [2 v/ j7 }* Y0 ^7 j. l) F
unsigned int count_copy = 0;
, T, K1 S2 m/ C& ^, W" G4 g  }2 C( R& P9 z1 K# U8 z

8 x( P0 d7 g. H- Gint main()
' ?. ~9 u' }. b0 Q% Z{, y0 }9 ]: I9 b' p! f; S
        pRX_MSG_PROTOCOL pshreRAM = NULL;
. U) a* i- U" G0 E        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; ^: T1 A1 H, a. a1 K) A7 s# K/ @
: j! t* {- }4 J
        while(1)
" H- I8 S- W% z: ]+ @/ }# U5 m        {
2 C8 L+ L& L/ x: d- t( r                read_MSG_buffer(pshreRAM);2 K" {+ z# U- {8 k( a4 A  U
        }                : g* `# v. ^" q, w- M) v& I% m
}  x( |% r6 H0 P
# L# Y0 X& j0 k% N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ |, J3 S: q  U2 ^( T/ I) q) g3 R{
" O- h5 h, P$ _" S4 w: Y        RX_MSG_PROTOCOL buf;
* X, ?- G& W  g" s  o- z7 c0 O" X        + W- f+ i5 a* k4 n& Z7 i" q! w
        buf.a = pshreRAM->a;) G8 k# I/ n  t. l4 }
        buf.b = pshreRAM->b;. F( q, S. g1 b- Y0 ?
        buf.packet_cout = pshreRAM->packet_cout;5 D9 c: Q0 V8 F6 N
        , J4 l( D& I1 }2 E9 i9 O4 ~
        if(buf.packet_cout != count_copy)
1 L" i$ G$ n  a, j  P% K        {, U8 [, |- _' k0 s- g4 o/ y3 W# e
                printf("a is %d\n", buf.a);: h, ~& M/ e1 _
                printf("b is %d\n", buf.b);! W( v+ y1 a& \
                printf("count is %d\n", buf.packet_cout);: J: @- Q/ _& U5 [% m% v
                count_copy = buf.packet_cout;0 V/ E; I4 Q& H( ]: g  e* O& L
        }4 y6 C& }" J, k+ z% C) v! \3 i8 S
        else. s1 i# K1 J9 {" ^9 N
        {
+ j+ k. j% [  j                printf("No effective message!");
' c! p( T' V/ W& L& ~* c        }4 E9 R8 \9 l6 Q
}6 h- e+ _  w; n; ?) }# o! j* c

3 ]6 l4 D. {! }9 ]' l7 G8 P; A2 r
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  I0 G3 ~. b- O+ [# b使用下面代码,对内存使用了mmap函数后:
2 q$ f& K4 v' E% H- N5 X/ K8 M#include <stdio.h>9 S4 q2 W' `2 [7 l" E5 J* d% h
#include <unistd.h>
( H% X- w' z, ~#include <sys/mman.h>
7 _  f+ v. j; I8 _1 ?0 [#include <sys/types.h>; L& m& Z- f6 ^9 s$ Q
#include <fcntl.h># @5 E' h) I$ M9 G& V

: T- q1 H5 Q7 [, F6 k3 w#define SHAER_RAM_BASE_ADDR    (0x80000000)+ U5 K4 m  w. |4 U
#define SHAER_RAM_SIZE         (0x20000)   2 h2 |0 q7 n' {6 a, h

8 M1 [- `% @/ H0 Wtypedef struct! p) s* F+ W9 f$ j# ~
{
( I$ F* v' l' w* z        unsigned int a;
7 N; C0 o7 I0 Y7 i        unsigned int b;" E2 x" X4 z! {% V
        unsigned int packet_cout;* H' V5 g, x# y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) e! d' i. J0 j# R8 ]# d+ |) F! A9 j3 x  |
void read_MSG_buffer(int *baseaddr);8 \1 T* z) w& h  i, {. p8 l
unsigned int count_copy = 0;
3 N+ N' W+ `; r$ ?# l
( k) I4 G. f7 v4 `4 J" }6 Yint main()
8 T/ p( y5 G& u, [( z  C1 O{2 P: N+ G# f0 \9 o% k4 o* n
        int fd;
0 l6 i/ n0 f" R* z; F2 y        int *mem = NULL;& b, f" ]% B6 `4 ^4 s" p

6 w* f4 O% a% t6 t3 J0 o9 C( P' J        if((fd = open("/dev/mem", O_RDWR)) <0)
+ M/ k7 ?. f2 S. ?8 M2 b        {
. y) ~0 j4 T% y: d3 Q' z                perror("open error");
( g, R1 {- ]! B2 l+ S6 s                return -1;
4 E! `+ E: t& p- s. V        }% u% C: J: O" [/ {. Z6 v. x: ^
        6 d) D( v4 t7 R: `/ L
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" d0 V) B% Y# t1 X2 X. T  d! x5 W2 @4 U% F; T3 N
        while(1)4 \; P2 Z8 c- f2 d. F
        {
/ M) C% T2 [& g# c                read_MSG_buffer(mem);, q( d2 W# B. J9 |6 H6 _
        }                + R' s8 ?/ T8 G" t; N- E- t! T
}, \8 j5 n& o/ Q4 E7 w7 a
( ?" z# _, B/ w+ w' R
void read_MSG_buffer(int *baseaddr)4 p3 [/ h2 g8 g/ g( J; P
{, s" T+ u3 f$ S8 x8 B: ^
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ ?7 g( x* r: T1 Q2 v. N5 X

. Z  K2 J! Q# k! @4 J- A$ U        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ r0 q& _7 ~3 D% |9 Y; z7 P( z
. ?# F9 D. S) f        if(pshreRAM->packet_cout != count_copy)# m, B8 D- y) B/ c, L4 n- V: @: [
        {
/ ~& C4 A& k! I* t5 p7 h2 R                printf("a is %d\n", pshreRAM->a);
/ @0 l: o4 H8 N# E) X                printf("b is %d\n", pshreRAM->b);6 l3 n& H. l, y. J- A$ s! q0 o
                printf("count is %d\n", pshreRAM->packet_cout);: H4 T) q$ p2 k8 u1 k7 ?6 E
                count_copy = pshreRAM->packet_cout;% E$ L3 A/ I1 E: h9 T
        }5 w2 g: f' ]: ?3 \
        else
% Q1 P7 v1 Y, m        {
/ h) A) Q" \9 |6 E3 X                printf("No effective message!\n");
0 \- u7 `; u* \' @        }
* m, v$ Y; u4 i* r}( Q7 A( H8 j( X0 n
/ j, [# x. F  L* m
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  X6 D9 ?8 P7 U' D

% T7 }2 H* t" `  A/ {8 f0 n
1 k' ^6 c- G  Z& u4 O
( {- e% {. K6 r5 g
0 z; r; u' m' ]; F- s' y7 k




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