嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 E; p+ _5 N( a& ]3 p3 y8 W
4 w9 \5 {) @+ yOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>" N. i* D# I0 L7 L6 E4 |8 {: ^
#include <unistd.h>1 @3 Y1 w' s- r' D' ^: N
#include <sys/mman.h>1 p$ c0 U# f$ W5 {- U
#include <sys/types.h>& ~8 y0 _4 B4 g- G2 L
#include <fcntl.h>5 _. [4 O6 P( D6 r9 Q$ ^0 i
  s; ^8 v4 X- q- D8 U
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
; P$ Z% T( c2 A9 H5 m( X5 d$ o) x7 r# i  ?* V  X2 ]/ X( i
typedef struct
2 C3 b; _& E0 C* ?3 P6 S9 l{/ g7 [8 R0 K9 [( g, K
        unsigned int a;* q/ c5 Q* }! G
        unsigned int b;! h) U' {5 M2 n2 n2 J
        unsigned int packet_cout;
/ t" X( Q) j" L) V9 h- ~}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" ~3 s- D1 I) L! I

: D* [3 w; {- l- mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ m3 O1 d3 g. f3 |; c: Zunsigned int count_copy = 0;; A3 |; Q7 I: d: w/ r$ e0 z

) u  R( M/ X1 ?! D8 Y+ L6 S; @* j$ {$ s4 M4 z1 Z, ?
int main()
6 C& @8 {+ f- _  i: T) ~( F9 c{
0 M( U$ [$ `# w/ }$ S+ r        pRX_MSG_PROTOCOL pshreRAM = NULL;( V+ U* u+ b# y$ D$ U. y$ @
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 C7 z9 ^8 e. d6 J  R2 M
' R# b6 m! B0 u# v& \4 h        while(1)
1 T- T/ z# Q" }% A        {
  J' ?" _4 F  U" l' {8 A0 M8 G4 s" ]                read_MSG_buffer(pshreRAM);3 l* Y& W1 \5 h$ X2 J# ]' I
        }               
7 p3 U6 K/ A: X}: q# Z9 q" M. ?8 @' s5 V% F

$ e* p' ^1 f5 N' g) o' qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), `: a( G" a7 R# D* [7 n
{* l* p. n. W0 T' N2 j
        RX_MSG_PROTOCOL buf;5 J# N6 n' i7 ?
        # F& x) l. u" i7 t9 d: Y
        buf.a = pshreRAM->a;
( R7 Z, G% C$ L        buf.b = pshreRAM->b;7 L+ p' Q8 x1 `  E. u
        buf.packet_cout = pshreRAM->packet_cout;" h( g/ B# b5 \* g7 J6 ^
        
# ~6 s/ k+ C- ]/ `! @0 c3 N        if(buf.packet_cout != count_copy)7 w  n4 q3 E/ S' f; l9 O( ]
        {
6 D5 ^% [" l9 Y" J                printf("a is %d\n", buf.a);- [; H/ `' k% ^) v
                printf("b is %d\n", buf.b);: r! I, e+ v. O& H' q1 u2 ?' Y
                printf("count is %d\n", buf.packet_cout);" K( e' Z( D9 x1 J" h4 u# V
                count_copy = buf.packet_cout;) H& D3 U6 }/ B1 c& d5 o
        }
) m' \  h& T! W, T; ?        else, o! ]$ }) M5 W1 s+ k
        {
5 T, w/ V3 r( s. b                printf("No effective message!");4 ?& d: s+ @0 j" P1 I
        }. r: ~6 a& w# n* r
}) P' V: [3 K* W  ~- @! R

0 x3 y  k% l2 ]- e- ]$ V' M: A7 f
; i% L9 L; A& d4 C2 `但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。! e$ R, J+ O8 u7 X% f/ G
使用下面代码,对内存使用了mmap函数后:
7 t+ q! k. m: \$ E& Z4 R#include <stdio.h>
  u+ T: _) t# Y- z9 y" m- ~#include <unistd.h>
1 i2 [" K3 w# ]) [7 T1 N2 y#include <sys/mman.h>9 w; ?( O' A) K4 P' ~+ ~, Z
#include <sys/types.h>6 U" Z8 j. }/ _0 B" H
#include <fcntl.h>9 E, z& S" m2 K( }9 H0 ]) d: o% q9 t

4 @4 N: Z- \7 ^  c0 f! X8 G) i& T#define SHAER_RAM_BASE_ADDR    (0x80000000)9 r4 H4 c$ X. U- L
#define SHAER_RAM_SIZE         (0x20000)   
4 O/ g0 y) ?" M% D1 E5 T5 {# _) M- @3 M1 P6 F- Z2 `2 H0 ~7 S' n
typedef struct
- H; x/ I: i  e{
7 R: V9 ~; `) G% |9 a' V9 t        unsigned int a;
- G% H# D! y* a7 o7 J        unsigned int b;
% b3 r  B' E4 u% r  @        unsigned int packet_cout;7 O7 j' S2 t& n5 G! I! D+ T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; h5 y+ K) A7 t; \1 B
; x! A) F8 }- s1 N: E* j6 Ovoid read_MSG_buffer(int *baseaddr);
9 ?! I' ?( `# c5 Q% S' u6 ?/ Uunsigned int count_copy = 0;% a' X- x8 m0 X) U( W3 L

& u$ J2 G9 `8 I" E+ v' h& rint main()
4 g$ X) \& X/ z9 q- K# ?; K6 I{: ^* C3 ?( h$ _7 c
        int fd;9 p+ i( ], |; O' {+ Q  t8 x
        int *mem = NULL;
, F+ ^/ u2 R* P  K1 i: e6 I  h) ?% @& J# q
        if((fd = open("/dev/mem", O_RDWR)) <0)
/ `+ ?: Z* U. C$ N        {6 p, P6 m- j- d1 l8 l
                perror("open error");
) B8 N# ?1 x: J& \5 [+ p                return -1;
" I" o8 T& S4 h: v' [( S        }4 W* f+ o& m9 `4 L1 b0 P0 }; ?
        ( n4 T1 R' x. J. i* m9 G
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 K& e8 d3 W3 M# z
. s, Q- @5 z' f        while(1)" x1 ?$ W8 b8 V0 h6 |8 w4 X
        {
0 B9 @, r8 j! E) Y: ]" ~7 y9 p* ?% \                read_MSG_buffer(mem);+ b. `# x# ?* M
        }                ; m% Q! ]' [0 s) N; M# u& S# D" B
}
! a3 W, V" L/ }" K, U$ p1 }% s+ ]8 m1 R6 N" R+ W
void read_MSG_buffer(int *baseaddr)
. ]2 y# o+ p# ?# Q- z3 g" J{
: J; Z& C4 W$ E# v        pRX_MSG_PROTOCOL pshreRAM = NULL;, m. Q1 n7 t1 g! R

' w5 p, {) E" C        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 r1 y- C2 p6 |! \: ^, [. b5 _. J
; B, ?# E! I3 _; q        if(pshreRAM->packet_cout != count_copy)$ H; i; Q: u+ o( J9 |
        {) b8 d. [& D0 [% \
                printf("a is %d\n", pshreRAM->a);0 V; G9 O6 ^; q9 h
                printf("b is %d\n", pshreRAM->b);
# ?0 L" \! G( p# R                printf("count is %d\n", pshreRAM->packet_cout);. `/ M8 P# Y( [5 |0 }* W
                count_copy = pshreRAM->packet_cout;
' a- z4 u0 l- d$ Z0 E        }
& b% r1 F, D" Q! m        else
- R8 n* _5 y- b# q+ L        {
2 U/ h3 M1 ^  ~1 H1 F- t: C: w: N  Z' ?8 s                printf("No effective message!\n");; u' l) E4 t7 B* @2 b& {& v: |2 y
        }& \: O, G3 Q& @* ]
}
+ R; a  w) w* U; _4 D9 k; {+ M% ^8 H: Q" N) ?5 O+ ~0 a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 |4 D( U3 C* g. L6 N7 A2 |& r
) ]! M/ b: _5 Z+ t8 l3 K
+ D3 t/ o3 \4 H2 K2 d
& o% |& e* r) _, t1 e9 B+ I# C+ P: J7 f0 a1 z7 w





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