嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . d% Y5 [3 b9 ^4 _1 a4 z
2 I0 S2 C. M2 u. u; K0 I  s. }. K/ h, j1 q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% ]  ]) R) \: L3 M/ ^#include <unistd.h>
6 e/ q6 Z7 y, }$ w: P9 C#include <sys/mman.h>; X' c. W6 J* L6 h# ?/ h
#include <sys/types.h>
1 {8 G% P4 G' l" ^#include <fcntl.h>
; c, [/ K, G* c% Y
: u& [; [$ @, c$ J2 f# H#define SHAER_RAM_BASE_ADDR    (0x80000000)   
! i( c/ i. O& Y/ D3 C% X
* {* b* @4 D. j0 f5 R* Wtypedef struct5 _. E8 \: W" L! q. d8 t+ u4 C6 l
{1 J& e7 \$ c7 \; r& Z* a& Q# I
        unsigned int a;
( {0 t( b+ ~' \& b8 g        unsigned int b;
6 M: F7 v5 M  k/ m, b        unsigned int packet_cout;+ w- N" D  P) W* c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, Y7 U' J5 C( e: H: r+ J) ?. O

  [* u/ W) }( V# U  `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* H# U. g! V) ?. R7 x# [4 R" c
unsigned int count_copy = 0;' o! `& E9 L7 N- c  T1 Z! t
; y. [9 ]8 I9 h5 Z7 r+ ?7 X% @
) T, E4 h$ a' j* H. g
int main()2 p1 p4 R. R7 r. i
{- O& a9 B2 X# {/ x
        pRX_MSG_PROTOCOL pshreRAM = NULL;3 p: c0 q/ f! W4 x; \4 q3 b* S
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& \  [5 g1 h2 Z3 n9 _! e
2 v# \4 k. e. D1 T+ a( s        while(1)
9 d  y1 Q8 j* d6 c( R: S        {
4 i2 i$ p" V, n- S                read_MSG_buffer(pshreRAM);7 T4 Q+ V* ~; L/ S) Y! t: o
        }               
* B2 v# T% @9 I) d" R) w  }& L}
- F9 A3 C4 |- f9 r" u
6 [5 C3 B5 I9 M% X- Qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! A! }5 e* P5 W& I4 H8 g{
, u& ]" q( i4 F$ l        RX_MSG_PROTOCOL buf;# A/ }3 B' ]+ e8 x
        
/ ~6 f% d$ A# x1 ~        buf.a = pshreRAM->a;: C$ E1 g' ?5 n( y4 C. H, {& x
        buf.b = pshreRAM->b;
7 K7 _, Z. q0 p# I1 |8 X* c5 l        buf.packet_cout = pshreRAM->packet_cout;. d6 G* ]# U# y( p+ T) N2 U! u
        5 h- j% |# u/ O4 i, ?$ O# D
        if(buf.packet_cout != count_copy)% U0 Q3 m/ _" d- D  s/ R
        {
# P5 P% X. v/ v9 B& g                printf("a is %d\n", buf.a);
! F& ~* x4 {. @/ N                printf("b is %d\n", buf.b);9 q$ g$ N7 r3 j- D' O6 e
                printf("count is %d\n", buf.packet_cout);# H" z" n# q' P  I* \
                count_copy = buf.packet_cout;% {( \; Q6 a  U" }' A' ~; u5 l
        }
; n, W/ x1 x1 L- J        else+ m, c: j# K: a* z
        {
3 B# W8 A: H) X+ B8 f                printf("No effective message!");
2 `; V2 \3 E* s: l; i9 }9 }2 {        }
( f; h5 r  w7 e4 ]/ U}
$ ^2 T! B7 f2 K+ t- Z
, Q2 g* [0 t" c8 n& a- q" s' |: N, E$ k; F" m: h1 Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 z8 I4 x6 J2 H; G; x$ ?
使用下面代码,对内存使用了mmap函数后:% n% t. f$ k. A7 U/ W1 a3 ]
#include <stdio.h>( u" O, o1 q/ L
#include <unistd.h>; W( n/ i5 e; I. u% G
#include <sys/mman.h>6 L. C. Y# ]9 L/ |8 e" G9 p
#include <sys/types.h>: j: q- @  P" _% z
#include <fcntl.h>$ @4 l1 q" p- e3 D' Q

" S6 d( [  B! C3 Y#define SHAER_RAM_BASE_ADDR    (0x80000000)6 [. y5 w& r' S* O2 r
#define SHAER_RAM_SIZE         (0x20000)   
9 h$ Z+ ^0 _. Y: J: V& @
, U, A+ b! n! o3 A2 Xtypedef struct
) V: ^1 ]2 m# f/ D0 |{5 J+ K; a7 s( M* m
        unsigned int a;
  x! ]: a! X# g4 n        unsigned int b;5 q) [. c$ a# _* y: [2 ]
        unsigned int packet_cout;! z+ c7 L$ Q+ J4 J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! x5 c4 l8 c! n% R

: N4 y$ G+ w1 H8 e3 Tvoid read_MSG_buffer(int *baseaddr);7 @6 F+ R. z3 ~
unsigned int count_copy = 0;5 ^1 J9 {) ?( n. P
4 X# U" t" ^$ M/ }. L9 z8 i4 o) e
int main()
4 F5 p' Z4 X/ O4 m4 m- [5 x{4 x* \! M3 w: c  a: X
        int fd;$ l  m$ s5 N; e* I
        int *mem = NULL;+ [* q  x9 e7 D# X7 E, ~
" U+ D& x$ c( B+ u. s- T
        if((fd = open("/dev/mem", O_RDWR)) <0)
1 S2 j# X% j+ l' i% C' e6 o6 R        {
& t; b+ c  I3 I* f                perror("open error");
; X( u) H! z/ k' [* {                return -1;
. {% o+ @9 |4 e- ~        }. e6 K  @& H) X3 N7 r1 E
        
5 b# E* U: a) n$ R% c; g! [: Y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. b4 F9 v4 |* ?- v. s. A1 g4 h6 V5 p( O8 `& b
        while(1)
8 n0 B! w' _1 m7 J        {- b4 g1 n7 u" V1 r1 |. ~  g
                read_MSG_buffer(mem);7 T; u& a2 X! w! W* a4 Q
        }               
+ s# ]) M+ |, U5 Q- R- V9 \1 a+ a}4 a# [5 A3 t8 ^0 H
6 w, R; v% A5 a0 H+ }. ]
void read_MSG_buffer(int *baseaddr)
+ J( d6 S. p9 _, L; b! z+ P9 Q) |{
" l! V  e5 |& j. i5 e        pRX_MSG_PROTOCOL pshreRAM = NULL;$ U8 A$ o1 _/ N. E1 f' w9 c

1 Q' g8 j+ e% w; o- k8 U5 U        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 ~1 R3 L* Z- d! i( B; K% |& E" k% S5 u: d
        if(pshreRAM->packet_cout != count_copy)
( D$ Z1 |( E* }6 d7 b/ w6 o        {
! n3 n0 l! S4 x8 H                printf("a is %d\n", pshreRAM->a);
2 i+ v6 x) H% V5 ]9 w$ r* I$ b! P- J                printf("b is %d\n", pshreRAM->b);% }; j/ n+ z! D9 E+ c9 }
                printf("count is %d\n", pshreRAM->packet_cout);+ C+ h8 `* r0 P0 \( W
                count_copy = pshreRAM->packet_cout;
( b+ i7 P) u+ i$ U4 L+ P2 Z9 [: R2 q        }
  Z1 V9 h7 E$ W% }        else3 \+ ~0 D/ s7 W3 H3 f- }; `  J
        {
+ B5 @% y4 h1 b                printf("No effective message!\n");
) r8 N& H3 Q5 E* z9 k        }
7 d  u9 j8 O7 m( E, c}
$ ~( j/ B( H1 ~5 \; S. w
# Q6 m( j, `* C. V没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  Q1 a; Z  G/ {+ K: Q* v% _

& ~$ y% J5 \- O; n1 A  Z( ?# ?1 i) i. m- f. C
7 ?- z$ \4 k6 A' ]3 p4 d& O

6 \7 K. K8 P) u0 a6 z+ X5 t




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