嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' W! m% p9 a9 h  x+ h# n# U% w0 Z/ W6 Y$ o0 j9 M3 e
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 R7 n  |& v0 z- M+ b: Q
#include <unistd.h>
, G9 f! j& ]0 g, w#include <sys/mman.h>
# z6 \' b9 e1 |- K' D8 G#include <sys/types.h>) ~7 J0 ]0 U1 T, q4 X
#include <fcntl.h>
/ l+ P8 B( Y) r$ ?6 E- H
" @/ B0 }' _* N5 w#define SHAER_RAM_BASE_ADDR    (0x80000000)   ' {. T. ]( W. V+ P: Y3 {$ N  x

3 n4 l  @$ e9 J' i7 u' Z1 Xtypedef struct( o9 F8 d' S8 N5 R4 Q  x) e: j
{) k' k" N8 V/ r' C! E7 L! x
        unsigned int a;
' y/ r4 B2 W  V  C( J9 u; G        unsigned int b;
9 ]% b1 d; R' H2 _* D3 b        unsigned int packet_cout;# v( P7 D( W/ K( d, D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 S0 k! ]) @8 Y1 t( a4 c* ~- S& J+ S6 M0 T) J3 s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 t7 o, v" A& B- Gunsigned int count_copy = 0;
5 e7 o, [) X2 t' S0 Z
9 O" b) h; R9 B" m4 k" L* `- q* D: t
int main()) u3 `4 G0 l! B0 J6 {% g6 Z
{, f3 u- G: X- p# B4 d
        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 F5 l4 L" L" d8 g' w; A$ F, |" D        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* Q9 v' Z7 w0 A* t( F7 q6 ?# F+ g( ]
        while(1)) f: l9 P- M* \
        {" L0 R; |1 Z1 R; t
                read_MSG_buffer(pshreRAM);
; F3 i! _& [0 w$ y1 a  B0 {2 O& ~        }               
0 W( y* O& p- C% u/ N3 q. W8 k}
: Q; k4 g1 J6 Y% v" Y* x# V
" g  g% F  A5 e6 ]void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 U7 P% j* i4 a9 q; Y! \1 ~{1 D( G% L- _9 e2 I
        RX_MSG_PROTOCOL buf;$ J2 Y0 N1 b) u
        + E) h- Z% e: f% u) J4 v1 G
        buf.a = pshreRAM->a;- M0 M, Z9 C. t  k  @
        buf.b = pshreRAM->b;+ u$ o+ A8 A, [
        buf.packet_cout = pshreRAM->packet_cout;# ~; F1 b# c& R& F: W; x
        
- v: Z! A2 F) [, K+ L        if(buf.packet_cout != count_copy)# M7 D( }% w( m% u+ N7 U" R6 `' H
        {5 F5 k7 ?& ~7 H3 s! t# c
                printf("a is %d\n", buf.a);# W& T5 c% ]# v2 Q
                printf("b is %d\n", buf.b);& F7 O0 V  B2 e# M' ^
                printf("count is %d\n", buf.packet_cout);
5 @3 V( o% o+ Q7 P                count_copy = buf.packet_cout;
& P# q) {/ F, p' z7 j4 U/ {2 t        }
' Q" ^- a2 R" }        else
8 J) z7 P1 P2 k: ^; F1 h) K        {) ]; O" Q  Z  t4 p, i1 k# m
                printf("No effective message!");
0 V* r! u) w! ~, s3 t+ l5 G9 Q        }8 ~! v- l  M/ q; N* v( S8 D
}1 j- Q, F# ?( h3 ~2 D
) r& x' K( S: d  k
# g& h2 y; W: n8 ^5 r
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  x+ w# l2 K; z8 Z- g使用下面代码,对内存使用了mmap函数后:4 ?( [2 C, E, ^. \2 Z8 E: x
#include <stdio.h>! U" Q' J7 k% J
#include <unistd.h>; t- |- J* W+ O/ T  |; O8 v& W
#include <sys/mman.h>! a( x6 ^# r6 o; h% y" Q
#include <sys/types.h>
( J' V0 S' x3 l#include <fcntl.h>
) b; w  R4 w  m. x& Q, T2 G: g' |7 D, C
#define SHAER_RAM_BASE_ADDR    (0x80000000)
5 K5 @+ |/ \* k; \#define SHAER_RAM_SIZE         (0x20000)   % @3 l6 L: e7 Z" \2 x
# G# f2 b: a& O) q7 X$ c1 \
typedef struct8 D" b! f! p# M
{
3 T5 E2 _( A# w! Y8 q; g$ |( ]* l        unsigned int a;
3 c/ a; R/ B2 c3 \; `9 t  ?        unsigned int b;. e! j3 X1 D7 ]
        unsigned int packet_cout;; x8 m8 D* y% a8 D/ E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' T2 _4 l% j' L0 H; t0 y) B, |7 T! {% X
void read_MSG_buffer(int *baseaddr);
: ^7 W  [0 @( p( q$ H* funsigned int count_copy = 0;" D2 o6 b% O  z4 Z/ w

6 W4 v3 g% |  \4 |int main()
; Q1 S+ q# ^8 e$ x% f; v+ m7 a3 \! d; \{- R+ B# A9 i  N( e9 L
        int fd;8 ~* v- E4 C4 T
        int *mem = NULL;
  n4 B# z& D9 j; {9 D# K' V9 k5 Y5 s, I8 D' h2 G" i2 h3 x
        if((fd = open("/dev/mem", O_RDWR)) <0): T' n6 z* G; f4 N' A2 M
        {
/ V: D( ~8 x1 s. z8 N, c                perror("open error");
- Y2 x6 ^# w) u/ R                return -1;
4 H. U* Q- D$ Y5 r: X* S        }
4 i( S4 `. d9 g/ g( T. ^' y2 d        
2 J0 j' |6 F) |6 d        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 a8 b8 N- [& F, o
( Z" u+ G1 e4 }- e+ S) }        while(1)
( q4 r6 {# A/ W2 s+ \7 P- Y        {  C  _- l: _. n+ _# F; J6 u* Z
                read_MSG_buffer(mem);' R1 z; B6 v* a( v/ f, F0 h
        }                1 N) U+ q! H/ s3 X$ v
}7 C8 D; O4 b' b. r! @9 F; ]( w$ p
/ I3 x8 t9 X1 |& u5 S
void read_MSG_buffer(int *baseaddr). g5 G% e: q: n3 A# A
{
! z0 X( t) R0 K+ s* J* e. [        pRX_MSG_PROTOCOL pshreRAM = NULL;
. {4 e* S- z- R* s9 k0 }& t3 Y( C( ]4 `
( P! h5 Z$ ^1 ~2 k5 t# U& B        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* R" S- v# g3 F: Z
9 W8 [; m. H  L$ s, T
        if(pshreRAM->packet_cout != count_copy)
6 y3 \( S2 z4 P/ X6 v9 \. g        {' I' U/ l# q6 S3 z5 `
                printf("a is %d\n", pshreRAM->a);
# k, P& L: K( p* O! S; P                printf("b is %d\n", pshreRAM->b);" {" I4 \. R8 K* ~( M' |2 E
                printf("count is %d\n", pshreRAM->packet_cout);- S) I; C' \6 d* |" o
                count_copy = pshreRAM->packet_cout;
6 c3 a9 w; J5 C5 ~0 x        }
9 S: S& g: K. r( O4 y, \        else; Y# V% C, \: G% l2 M9 K
        {: w: c( W* p; T! H- U8 o- d, q
                printf("No effective message!\n");
3 ]/ g$ E# X& q  m        }9 }' Q; b  _4 E! B8 x
}
9 M# t: Q# i7 |! O) k: Y
% A2 p4 N# v6 H2 V8 h; w, @  M没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- K) h! r0 l& y) i9 ~- i

9 M3 P5 d. `7 |0 u6 m9 {, K6 s. |, D
; _# \. P- g4 g' O7 h8 N4 d( f2 x/ r

0 ]1 S/ y4 {0 ]' Q- K




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