嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) I  |9 J5 ]% v/ g

: K7 a2 u. O. e) OOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& k% I  u4 A  ]  W
#include <unistd.h>$ T7 N5 _6 S! w( B8 m' T
#include <sys/mman.h>
5 T3 X7 E/ Q* D6 Y( d0 d2 f#include <sys/types.h>
% j7 Y, o1 g0 B#include <fcntl.h>+ S, N( V  A$ {. m0 g% s2 ]  b

& O. `6 T8 [+ i, A#define SHAER_RAM_BASE_ADDR    (0x80000000)   
5 v. l4 v7 f3 Q* `/ [$ ~- Q0 x. K. S5 _' P' @3 Y$ L6 ?
typedef struct
/ |4 t3 i6 Q, p0 E, C3 W/ Z1 X$ Y{
6 {7 [  O3 y/ z. q+ Z        unsigned int a;# }. K) b% l. P) U7 u
        unsigned int b;
6 l" s% o6 B$ D+ ?) G$ s        unsigned int packet_cout;
* q4 o& {( T# v1 h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ N% L- ]" O& j' A$ K2 _( E" ]9 u- N' I- H. w/ [+ i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. K1 N+ }0 b3 E( A- w1 ]/ Tunsigned int count_copy = 0;+ g# J$ J3 ]" m- v9 }6 r, y

3 F& Q3 a8 v3 B, }0 \! j1 U5 w) t: @% g9 r
int main()
- R) E9 I1 K. G# P. L{
6 ~- h$ L0 u4 H+ L: }) i3 k        pRX_MSG_PROTOCOL pshreRAM = NULL;
: S. z4 P- d- n        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ R+ Y2 {" H7 a6 U+ B

! W9 Q, R* y* s  j        while(1)& b- @; q4 b" q  g# Y: E: a
        {& n8 j$ x: i" ]' }! t
                read_MSG_buffer(pshreRAM);
/ l' m* x$ ?9 a        }                ; a0 h! ~8 V  t# v' O$ M
}
8 y/ i5 V4 \! I6 ^' x7 C! |6 C+ f1 g9 {4 y1 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): p" W# W; K' G' Y, Q  ]4 k
{. |; l$ k9 h: I, C
        RX_MSG_PROTOCOL buf;5 z7 S: n7 |& `* r
        % @# }% g  V/ F/ {8 d7 C
        buf.a = pshreRAM->a;
6 N% q6 |) X* B/ I        buf.b = pshreRAM->b;: Z* |/ v$ f% R# ^" M' B! a4 k9 S
        buf.packet_cout = pshreRAM->packet_cout;
4 X* s6 i- v, ]) M2 b+ i% {7 v        
* |* Q. ^; T7 j2 X% E% r# m- }! u) n3 U        if(buf.packet_cout != count_copy)6 `& u7 W6 \) Y
        {: u& ^: b) j3 N* L2 {
                printf("a is %d\n", buf.a);0 h7 w8 I# O  V7 r
                printf("b is %d\n", buf.b);
3 R1 e* ^; d1 J                printf("count is %d\n", buf.packet_cout);
% L# Q! G: X: G( {                count_copy = buf.packet_cout;( X, ?, ~, }  c6 I/ k
        }
" x1 d; A9 i6 P" k7 X  t        else+ z& ]! ~8 w0 n0 J% S2 T, v" p
        {; c: Y/ B# y, H) g* b
                printf("No effective message!");
& g0 }; R/ J$ K+ s  V$ ~        }
# w  F$ D% h6 f6 a}1 {4 x6 g* S' ]+ y. `- u

: t# B, O& r8 w& ^1 S  C; K3 d/ U* }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. B1 g  o2 A8 J4 q) O
使用下面代码,对内存使用了mmap函数后:
$ t: A) Q4 Y  ~6 K" _. H6 ~#include <stdio.h>
" q3 ^# G3 `/ O# c#include <unistd.h>
& }6 \, z8 A6 d: K" S. H! ]#include <sys/mman.h>3 J% a: t; \, ^$ l; X7 b
#include <sys/types.h>
$ h' h" ?: _; r#include <fcntl.h>
& _3 F' m$ w3 F1 K  _5 I9 T" K. [. ?; ^5 [$ F& ]" k
#define SHAER_RAM_BASE_ADDR    (0x80000000)5 _" W3 c* h3 b6 \- L! I! Y
#define SHAER_RAM_SIZE         (0x20000)   " o, d# y1 s4 Z0 N  t3 K! [
* T/ ~( O+ @+ p! c
typedef struct
7 y$ p# U" Q0 i{  A- @' W* ^5 ]* V2 a! z7 }
        unsigned int a;9 j* P: v, w: ]2 }0 M
        unsigned int b;
0 \* C- B4 [( p, u8 G5 V6 r) M! c        unsigned int packet_cout;9 g  s+ [0 V4 K; m1 w; c6 d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& w# `$ a+ R; k5 F; ]; L
/ M( e" h- L$ \/ T+ n6 }4 [void read_MSG_buffer(int *baseaddr);/ C1 q; P) `0 a- x& p
unsigned int count_copy = 0;
. i8 Y7 a; j0 H- B' Y% M
9 A; F& M/ G, m% _# a! F  F  Xint main()
/ l( v, d: r/ ~7 o7 B) [8 x! K{- `; V) b' N7 R* r' w# }3 r
        int fd;, y2 r% E* j* {+ f4 D
        int *mem = NULL;0 V( i8 I* r3 _1 T$ Q: @
* r3 w1 y7 I4 _) f. r. V1 @
        if((fd = open("/dev/mem", O_RDWR)) <0)8 t2 d4 y# \8 ^; u
        {
1 A% H- `( T9 m" H: {0 F8 J0 C                perror("open error");
2 k4 g2 h/ x. |& i                return -1;* {1 T/ X$ r* {
        }. S4 ?$ [% y5 x
        
8 y8 f' E' K+ D- w' d3 p( s2 N        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( J$ _- |: {# U3 J7 p3 `1 e
6 h2 U( V# ]9 w! C# \
        while(1): N6 u5 p% {* U7 O8 L1 t' b4 f
        {
+ c8 ?2 n. z7 |" f5 ~( K2 r                read_MSG_buffer(mem);/ o$ q# A8 ^. b8 M3 \
        }               
  S% |# c6 @# Z( z) [* _}  R- t4 D8 |; L) J+ V/ M

6 h  t4 Y9 o" i3 nvoid read_MSG_buffer(int *baseaddr)
- W- Z  C9 z, F9 b2 h) E: r- Y{
! ^- I$ V/ [' H, D' n* Z        pRX_MSG_PROTOCOL pshreRAM = NULL;+ p# w4 \9 i* ?: t' t6 A4 C

- {2 p3 E' u' A5 v7 ]% |( g, |# W        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' T" F6 F8 K1 w0 C" z& [7 x7 i0 c( l
9 t, g( W4 M8 R& ?1 C& m7 C
        if(pshreRAM->packet_cout != count_copy)+ x! D3 W( v* x1 j
        {* F5 z2 H2 Y7 h
                printf("a is %d\n", pshreRAM->a);$ G" F& U7 ^6 n) j7 ~5 @
                printf("b is %d\n", pshreRAM->b);! S/ _8 t: N- t* l5 F4 ?
                printf("count is %d\n", pshreRAM->packet_cout);
/ |! i& x8 r3 C% o                count_copy = pshreRAM->packet_cout;
; W" C: Q6 F7 \9 [0 `7 S, l# ]        }/ o0 Q- B, b- y5 l
        else
' b( G, L7 s) Y6 ~; c, U, V        {$ y  m% R1 x6 l& Z
                printf("No effective message!\n");
5 M+ a& S* ]' ?* I: c+ P$ Y: U        }5 s9 Y' ?/ K3 ^% z3 d3 p2 n
}
/ k7 |# a6 l7 k/ P7 D# R, h
. @2 R! I& a) `9 O* Z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' }/ y  Q, e' c. t) C( C' _2 J

& ]2 P1 D/ y7 q
$ O$ R9 E; j8 ]4 T" m7 R
3 K; D2 D% r+ X9 g( ~% W' C$ j/ M& ?) L





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