嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( ~- c' O- R1 ]. O0 {# r
6 g* ?7 w* y- h$ l8 }3 u6 O, _8 c* qOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! N8 C8 K$ V, m. h# K5 ^#include <unistd.h>& `7 T9 G9 b$ _9 U( B1 i
#include <sys/mman.h>. O( n7 D% ~/ V( v
#include <sys/types.h>
$ y3 T+ F: y1 C; \8 U#include <fcntl.h>
! o, S0 o6 R9 X9 A3 y4 O0 \' i; J  @3 @. m% {* w- W$ Y. q) N
#define SHAER_RAM_BASE_ADDR    (0x80000000)   , S: e/ @2 a7 Q: K3 m

  K. G( U$ p+ k$ N- Y- J/ ztypedef struct7 Q' D1 h4 A3 u. m/ o
{
& |) U; y& h/ `& a1 }        unsigned int a;8 @5 P( B3 T4 c7 g7 e0 l9 U
        unsigned int b;
& I7 u  ?/ O, S" M1 a        unsigned int packet_cout;
, T& d/ U- y/ i* E! m& l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 P) F% o; j- G* @0 V' t/ D

! p0 [2 j) c/ U+ Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ @$ R0 H6 C; h% h9 _$ `; Cunsigned int count_copy = 0;7 b) u3 l4 u7 f# h* l+ G

/ O) {& q; b2 s1 g# h' E( G/ ]* }/ {; k6 D
int main()
' E% x7 X- p( r" F7 I" ~{  M" T3 [) }$ s* e7 [# F1 {( k
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 G0 M* w( r1 Q- E) A9 f
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, ]* J5 H! y) W2 K& S% S/ U6 H% U( {' ]. I
        while(1)
+ U& I2 S9 D2 J        {
. j6 ~" ?3 e3 J$ _9 o  }                read_MSG_buffer(pshreRAM);" l3 T  a: c6 \! h$ Q8 ^
        }               
7 w% d. \) s2 E9 W+ F1 E' ^: t5 [& b$ y  w}/ c+ ^* k7 i% e6 r: n1 s

, _9 P& A8 _8 Q- Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ h* b8 h+ ~5 Y2 L  k  f: c
{# O! o0 Z9 _# s& E9 Z
        RX_MSG_PROTOCOL buf;
' f% X; I% U5 k) P* j+ g6 j        
1 b  l! ^3 S+ X4 z: y        buf.a = pshreRAM->a;3 c! E9 p$ Y4 j, O, k
        buf.b = pshreRAM->b;+ J+ Q5 K. o7 X" b# G3 }
        buf.packet_cout = pshreRAM->packet_cout;! S- x! W, q% V( _7 R: H. N# k6 j
        
+ [1 S! @9 K. f        if(buf.packet_cout != count_copy)
$ ~2 D3 b/ p1 Y, g: W* ~1 R8 l) |        {
# j, I+ O# @  k/ m0 p                printf("a is %d\n", buf.a);
( c2 g: ~7 I+ }! _' G& H  ?+ e                printf("b is %d\n", buf.b);
. r- {, v$ Z4 ?: D& J% h) v                printf("count is %d\n", buf.packet_cout);
3 Y! k# F" g& v$ r' W$ B* {                count_copy = buf.packet_cout;5 C" V& f. |  d: o
        }
9 ^7 V, o/ f3 ]$ `8 [: D  [: d/ N        else
& u% N( X+ [8 |+ [( r. z        {. M5 h% O4 m" ]% X- u6 m
                printf("No effective message!");1 X3 {3 I+ C+ K% M
        }: O! T! e/ f# k
}* ?" k/ A3 Y8 g: P' T: V# o
3 u' k. p/ C1 C; ]3 Q; b; F
. `: z. v+ p% Q9 F
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
# F  y5 r$ D$ o7 f. l使用下面代码,对内存使用了mmap函数后:
9 }* u2 U- K3 M/ n& s#include <stdio.h>" I* y- P7 L; e7 A; e+ f. \
#include <unistd.h>; @' `7 m1 d# y. A2 P, R
#include <sys/mman.h># u3 K% n& ^  z7 T
#include <sys/types.h>
4 ]5 @/ W. E8 V8 x% w1 I0 z% w#include <fcntl.h>
/ z$ M$ f% Y1 ~# S. T& o$ w* |( L9 L3 b  w- J. X1 }. l' X; X5 p
#define SHAER_RAM_BASE_ADDR    (0x80000000)- U+ L# A- z3 [
#define SHAER_RAM_SIZE         (0x20000)   
& W' M! O( M! u0 A0 p6 e) C3 J
% c8 p+ o3 @7 htypedef struct
6 ?9 K4 i; t  P{
% o. d  @1 y! }        unsigned int a;) _- f1 G" L! q6 K8 c
        unsigned int b;" ~: x* b  N: W$ s
        unsigned int packet_cout;
/ H" r2 g- l. K5 F9 P( N}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, N  Y; F. |# _( ?
6 Y1 g; f5 S+ {3 \( J* y
void read_MSG_buffer(int *baseaddr);
: W3 d+ q0 Z! }4 t- s( I0 Lunsigned int count_copy = 0;( z6 @& _- h/ U. f3 C1 q! Z. @

7 J/ T% W' C- `: \( ~int main()
5 U% ]7 j4 Z0 V. W. H6 N{
: C; R6 U: |5 |* |2 ~: b8 |* k4 N        int fd;
/ p3 E9 m+ X* ]! ~        int *mem = NULL;8 \, k' Q( l( \, g9 h4 B

/ X3 W4 z' H0 Z1 x5 [1 m+ i        if((fd = open("/dev/mem", O_RDWR)) <0)6 q" o" K5 ]4 z2 K7 U
        {
  m, |! M2 o# M9 u8 w/ ^4 M                perror("open error");
. k; ~: _3 @1 ^. \1 c% r& ]                return -1;% [) Q& o/ ?5 b# k3 t( ]
        }
" [" p; J6 U+ Q" {( C        # ?/ J2 E5 u6 _! N
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' E$ U, e" a1 l& q- P
/ t* J3 D5 K- x4 S$ I0 h
        while(1)
, H6 I: }# j" q        {
( K7 m& B4 h* v( m  j3 E                read_MSG_buffer(mem);! a/ q7 n, v+ J" m- O; l
        }               
5 A$ S- d* @# O- G, X3 o}5 O: C3 N" [# y9 ?# f

# F5 f+ |7 x3 C7 f: S( ^% w- k2 ?void read_MSG_buffer(int *baseaddr)# {  a. k, I4 o2 T: D2 \
{
. c! w2 `! R3 g4 @$ V        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ g0 e5 y, p+ Z
( Q) N& \2 {- j/ Q/ Q. L8 A        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# J1 n& }: P, g% Z" Q) w# S8 ]. O
1 g" q: W7 P1 M5 v( I# A
        if(pshreRAM->packet_cout != count_copy)
% w" l" o" l) V3 R# h: o/ B        {3 A& M4 T+ d; |1 T
                printf("a is %d\n", pshreRAM->a);. }" P- Z" n) S' K( G: p5 K3 v
                printf("b is %d\n", pshreRAM->b);, d& l: T+ q- C4 V4 Y
                printf("count is %d\n", pshreRAM->packet_cout);4 T- Q! u  z% J0 B9 y; [5 O
                count_copy = pshreRAM->packet_cout;" q9 b0 _9 ~' K
        }
+ V- I% v4 @6 |% _, A) f        else: V" t* f7 `2 K* ]0 m
        {
# r0 U  O6 K: n! u                printf("No effective message!\n");
9 H4 ~0 J: c4 J$ E2 u1 P7 o        }4 ?6 D. Z+ V1 o$ q" ]9 I
}
1 W$ r! y; ~) X
# l; C; f& E  [9 R  [* W: w" w没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' F6 J" g% b( a/ p
* Z& o) Q0 O, [& ~3 j
$ L5 n0 |1 j4 u5 @5 ~' q6 z
; R2 ]" t$ }4 R; L# y
! Z" w& r# Z7 G, \9 O0 E





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