嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 s. i! }3 }1 c; r9 Q' {
' X3 W- I: L4 C/ j, GOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( o/ G( m" Q3 r. S9 B! c! T#include <unistd.h>
( S6 L3 T2 A- \0 A#include <sys/mman.h>: J8 D: W" ]. |& L% ?2 b
#include <sys/types.h>! M+ S  N; Y  F" z- ~( b7 y
#include <fcntl.h>
, h  D' U' M4 S4 t2 t
* X5 W( [: f5 f/ a( f1 l' X3 T#define SHAER_RAM_BASE_ADDR    (0x80000000)   
$ x) ]  w. c2 r* H' O+ e
# T8 o& R) d! a  Htypedef struct
& I" @1 N+ {' }: f8 _{
( K6 }5 D9 W1 |5 D  w: x; _        unsigned int a;
0 |4 ?. G  A; I1 I' u) v) r        unsigned int b;
, M& k: t9 I7 u% M        unsigned int packet_cout;
9 a+ m" E2 f) f- d1 E}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 f* M! T! n0 i: R' A
1 Y& @! [7 P$ W3 ?9 @. t( M: h1 g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ r/ {8 ]% b2 T) t" M
unsigned int count_copy = 0;, D! }1 B: [- [$ O* X, [" p. l

; N4 o: y2 U& l9 o' ?# }" ?1 V$ x7 S6 o  o
int main()+ s2 n- W; K+ `7 S
{
4 O) h2 `/ B# N# r& K+ x        pRX_MSG_PROTOCOL pshreRAM = NULL;. R* n  A2 q2 c+ r$ A
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, K! z! E. Z$ b; }  S# J

7 m$ L, L  p5 A5 [$ x8 A% s+ `        while(1)+ K: x6 L7 X4 u, z. j1 ^$ G
        {7 @) e* @7 u" Z& f
                read_MSG_buffer(pshreRAM);
- l! V/ y1 T2 m2 o- W% X- V" Y        }                  |) I1 ]. J( f$ S
}2 U1 L# a3 q% A9 F. {

: e% Y2 P& ^# j' Z8 S/ N" S! H1 Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 r& o  ]1 q6 Z, k
{
: a$ k4 M/ ]  B- }4 {1 }! v        RX_MSG_PROTOCOL buf;
+ ^, n$ \: ]5 S7 R" a3 C        
: z8 U/ y2 H4 r) ?* e$ S0 \        buf.a = pshreRAM->a;
2 [" Q7 X  o3 x        buf.b = pshreRAM->b;
. T& m! D$ k3 F1 Y8 g% W# K: ]        buf.packet_cout = pshreRAM->packet_cout;6 U) C8 W6 e, {9 q' A2 k
        
% Y6 k4 ^) ~. e! |1 Y% T        if(buf.packet_cout != count_copy)
: y3 m& j7 U, ^        {
0 }2 P  H/ w: e! {3 U                printf("a is %d\n", buf.a);
  y4 N9 m/ u! H( F9 u                printf("b is %d\n", buf.b);
  O& r& E# h) Q4 b- o  ]) A                printf("count is %d\n", buf.packet_cout);
( C7 T* W  T8 ~( D! w                count_copy = buf.packet_cout;1 t8 D) l% [' c
        }
( u! I" z# s; F4 K3 M        else
7 j; f4 Y0 t  f! [- N        {) u4 }' M4 ^6 a1 p8 n* \
                printf("No effective message!");
. g6 A% p2 m  J7 i        }
6 U8 q/ @+ ]! z/ T. a8 _}8 j: ~# J6 z- \7 G" U4 H4 g2 z

/ T3 P+ F2 J2 I4 {3 a+ H+ q* B2 Q* B7 m4 [& K& Y' v6 p' J% U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ Z5 @" l  b# ?  `使用下面代码,对内存使用了mmap函数后:! _, ?& O3 D4 W1 m
#include <stdio.h>
& r4 ~# P# C# z; z#include <unistd.h>' S0 y$ G0 Y; Z( `" e
#include <sys/mman.h>% t9 E6 S! M+ k7 r8 Q- C
#include <sys/types.h>  q9 c2 Q- U5 P7 ]& `2 T" }
#include <fcntl.h>
; p" \. C8 s& {% L/ x$ D/ A3 q/ v0 z
#define SHAER_RAM_BASE_ADDR    (0x80000000)
7 Y0 r* @! i( G1 F+ B( U#define SHAER_RAM_SIZE         (0x20000)   
5 f9 x, R6 q7 n3 c- x& M
6 o0 S2 T5 d1 x- n$ Q1 r1 Otypedef struct  q& Y6 [" `6 v4 o
{
, a' y+ J: o) |/ L& l        unsigned int a;
" T( T$ [7 ~- Z- f6 ~        unsigned int b;
9 i; D; E% k8 r3 X        unsigned int packet_cout;
" J5 z' M! k1 D3 c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. \* C4 h) D& s, g4 W$ k, c2 W

' M+ j3 z& @( Y- H4 Y  |8 p0 bvoid read_MSG_buffer(int *baseaddr);
7 k/ ?4 c; @) p$ z$ Ounsigned int count_copy = 0;) n  k% S4 x* d3 ^2 n

4 n/ ^8 C3 z5 |6 g: H0 tint main()$ X) q6 v. e- B* o! s7 d0 N: V
{% o3 H+ V/ |4 Q! a0 W  J$ @
        int fd;
. k6 ]" L. M, \( b  h( L        int *mem = NULL;
- F8 f+ P# V. _  x- d. A; Q( ^$ {2 j
        if((fd = open("/dev/mem", O_RDWR)) <0)) c. z7 X! G# i$ A0 T( \
        {  z; z3 ~) C; Z* \" i7 I
                perror("open error");- ^5 ~  |6 ?4 |7 h+ e
                return -1;' k0 W, Y6 C5 W- p" D5 D) u; k
        }
8 S# h6 ]$ t: F  J$ B        
. y- |% v" W$ L5 t7 j- F        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. `9 j; i6 E7 t$ ~
7 H# K: n, h& g2 r* H# @        while(1)& h8 t* f0 n; h* _4 t! ^
        {! e% J5 k* ^4 z" _$ J' j
                read_MSG_buffer(mem);# ~+ M9 g4 D6 L
        }                ! x0 B; G3 v" k
}' i8 v/ g$ ~7 G0 F2 j* V6 x% v

0 j+ @- f) b4 H* c5 V6 t* ^# Nvoid read_MSG_buffer(int *baseaddr)
5 Q0 X6 X- p( i- N5 P( D6 X{; f2 ?5 a6 k! h$ l5 f2 f
        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 \4 a( {4 [+ V8 B4 N5 o" u7 l* f! C/ J, U/ B: \
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;3 l; x5 k8 Q. o* e+ E- z: E( R+ N1 z
8 [* P  Y4 F; H
        if(pshreRAM->packet_cout != count_copy)4 h1 H) o* I3 K/ N# G# n
        {( J( }: d5 y( t! n+ S6 I
                printf("a is %d\n", pshreRAM->a);
: L7 Y* h  v8 r  p                printf("b is %d\n", pshreRAM->b);
! A+ k- j, m; v: X                printf("count is %d\n", pshreRAM->packet_cout);
6 c( u: d/ c; R. g5 W                count_copy = pshreRAM->packet_cout;8 T9 y- Y0 O, ~( F/ \/ W
        }
' {0 B# \0 e. t3 R. I        else
8 O' s9 ^' z6 K; ~- V# o        {
& x+ E  e2 ~( l7 \; j2 [, z2 l' s9 j                printf("No effective message!\n");
7 N4 p" l( V- {' C! e& h        }
. R$ z: y) T4 }+ x& F}0 L4 L) d6 @7 l

$ @7 P+ W9 A9 k9 b/ B; Y  p1 l8 H( d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
  O' |& O' B' W5 ]1 e4 ]: O+ b* E
# I8 c0 N1 y9 ^' J# u" l* I* M0 t9 {- B. M7 ?
" p. ^5 f; W! x# l2 h- o3 X" _. J' t; v
! E; l8 X/ z( ^2 J7 Q; B





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