嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : s2 u' b2 K, G0 a1 X" O: {; k
% k1 i2 {% D1 w8 U: E1 a2 w: a* v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: v9 D4 e4 }7 z3 w/ f0 U
#include <unistd.h>
3 V! o# J' N  W#include <sys/mman.h>1 |, G* S5 x: C) l3 @( B
#include <sys/types.h>
/ B/ i- W; E! M. z2 Y1 N* Q% I' {% v#include <fcntl.h>
( q* M9 D- k4 p$ B* h8 F5 n& o) B/ n! D* Z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 V+ a' ^  c' `4 w, [( \- u/ S! O/ x3 e
typedef struct0 L) f- ]0 p/ @2 l5 M. h& p4 b6 E3 A
{
5 ^$ M  P0 X' \4 W: g2 f' m        unsigned int a;. G6 k! M1 v4 m! z
        unsigned int b;& H% q$ x1 a& a  a$ t
        unsigned int packet_cout;( c3 H1 ]; e  m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. l( M5 F# F; T+ W! W9 j2 y/ H; [- _; P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% G# G; q2 b6 r  d1 cunsigned int count_copy = 0;0 y: B2 e2 d& {2 T, Q

) h0 N% V8 X" {$ A6 x2 l3 o! m) w3 Z0 G' u0 X6 x  u
int main()8 P; v/ o/ ?1 S0 m) l2 x7 ?
{
! Q5 H5 Y8 R; ]4 F        pRX_MSG_PROTOCOL pshreRAM = NULL;
. t& {6 m, a8 u# e+ C. V2 y        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ y' T8 f6 O2 h

, [7 H( r& J" H9 A1 @        while(1)+ ^. a( P' N" [9 N8 I
        {: t- l* n8 {1 w/ L4 e
                read_MSG_buffer(pshreRAM);
( x- d$ z! k) b* A+ V- X        }               
8 c2 ?. ?2 Z! d}
/ `7 f$ p! `4 z) V; T0 L6 T; q9 L( I+ Z% i  |5 w# R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
$ b8 k9 S5 `) Z0 h{
# F" T# C. c! u# P* a( x% ?9 O3 Y; t        RX_MSG_PROTOCOL buf;
3 h: O% i4 \: f  C1 t        
) l8 A/ l7 a; Z5 J, @- _, Y, w        buf.a = pshreRAM->a;
8 U! x+ X7 |4 |4 U: j  G        buf.b = pshreRAM->b;
1 J9 E( W) z' V7 c        buf.packet_cout = pshreRAM->packet_cout;* U4 C4 f1 k/ h* z0 {9 U
        
( Q) |3 M( {; f9 x% k. E        if(buf.packet_cout != count_copy)9 |* i5 ^+ k( G2 t% N' ~; _
        {+ n8 u( u+ b% p' D: N6 n/ n
                printf("a is %d\n", buf.a);
% B. c, ]6 @. }# ~                printf("b is %d\n", buf.b);1 V. m7 k9 f' c/ ^
                printf("count is %d\n", buf.packet_cout);
4 Y/ ^) I  g' p( Q- Y. N                count_copy = buf.packet_cout;
( m7 o7 A! A6 ~2 _2 n" U        }
  D/ S& [# I' V$ C        else4 O9 y2 p; ~, U. r. m
        {) j/ ~: A6 U) u  h$ ~- a1 S
                printf("No effective message!");8 O" Z6 N' F0 g$ z! P
        }' k; t; v8 U2 k
}
+ U4 ~  [1 @' I: i0 Y- \! O3 A# e6 D4 Z9 x( U
# v" |% n5 m* a8 @0 Z, d
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 I! q8 y, l# r. j9 }7 x. X( h- y使用下面代码,对内存使用了mmap函数后:) W! b! r! {4 L/ p" z" J
#include <stdio.h>
& \. |) u* H5 X0 x: [4 d! W#include <unistd.h>
2 R0 D4 c, x" c4 `( y#include <sys/mman.h># S5 _7 }( W& ?3 a) a
#include <sys/types.h>
* L" t; F7 T# M  Y#include <fcntl.h>. O( n3 \( p, e% @
' s+ S$ b- \$ i
#define SHAER_RAM_BASE_ADDR    (0x80000000)+ _" B& t# }* ]$ h8 K) c
#define SHAER_RAM_SIZE         (0x20000)   % z; I, N' P* w" m0 p- v7 F0 T* Y
5 a/ h. `/ ?' b% e" ~3 V, O' ?
typedef struct
' W$ m, |# v0 x. f4 P{& P4 b; c  u+ [+ M
        unsigned int a;
$ F! Q8 @. d: k, ?- {9 Y# C        unsigned int b;
; p" ^; T- p; [4 \* b; a        unsigned int packet_cout;  w# o: Q3 \2 Q( ~+ [) a1 X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, J4 j3 {- G( K- y
  ~/ M6 s% R! yvoid read_MSG_buffer(int *baseaddr);2 Z5 J" G; G) a
unsigned int count_copy = 0;
. j# f$ j3 L7 C# g- ^# |
8 L7 O# H% ?/ k$ R- Y& Gint main()4 i/ e% \, ~$ k4 @( \; H3 y
{8 x# }& L2 `: y$ J' g/ s7 I
        int fd;
) l4 Y! ]0 q$ }5 w  ]        int *mem = NULL;8 n1 Y2 |! l6 Q+ I

& Q4 _* p7 L$ F. @0 n7 o        if((fd = open("/dev/mem", O_RDWR)) <0)/ b6 \- t, P: W+ p6 `: l* |
        {
% X& t! s+ |7 f2 w7 }) Y) h9 C                perror("open error");" N, Q% ]' X  |! {6 z: N8 z# k
                return -1;3 c& b( r1 |% \* l; w
        }
. l3 b! {9 z7 O        
9 i! ?$ v% e1 Y$ \        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 x7 y: l4 M9 ?- X( M! C3 Z* s) w" D4 d
        while(1)& a2 [1 W% c, c# O' y  h! k
        {% u8 m% D9 ^4 S8 H& U
                read_MSG_buffer(mem);
) P4 u+ h/ ]8 T; k  U7 N6 o        }               
( r3 o$ \( w5 k* e4 C1 n% b}
! U/ C# T8 r7 L9 J$ u: ]2 W. p9 ?! o" c
void read_MSG_buffer(int *baseaddr)
9 k+ G' m# l$ A, T3 q" ~{  h9 b# F5 Z+ n+ w
        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 F. Z; Z2 P+ V  f2 v
2 ?7 g  z3 D- x% |7 O        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. ]$ _8 s; K: a

9 L2 w2 y, r# p' L        if(pshreRAM->packet_cout != count_copy)
- y. w. [! ~3 I  g; Q) s        {
8 t4 M3 k. ]" E3 z0 x( s                printf("a is %d\n", pshreRAM->a);0 M/ N( o% W0 N0 k9 U
                printf("b is %d\n", pshreRAM->b);
5 o' ^' C8 b) y  _9 P                printf("count is %d\n", pshreRAM->packet_cout);5 R! T9 m* I2 H) a* d) ]; p$ j5 u
                count_copy = pshreRAM->packet_cout;. J) R" `7 f' I, `
        }
6 {4 [$ Y" ^2 A/ i5 k2 q        else- A, ]/ \2 ^" S3 V" e, j
        {, q  V9 \1 n& R" x8 d
                printf("No effective message!\n");
. O% m* {1 @; ~: a        }$ [$ ^) s& m& q4 }' g
}
+ h3 {" ]9 ^( k& ~9 Q  {
: y& @. u, \6 t& n% _没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- H5 S( }) R* L9 F7 j" b" q3 }% N  X
" n( P+ p/ H) o

/ a3 [! o  ~. r% Q; w
8 r; u- j+ Z0 k
& Q9 @; @0 o/ Q+ q9 I& k" r- s9 f- U




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