嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 }7 ?5 x9 @, G& U3 Q4 f! J
$ q" O6 G& ~3 l( @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 W3 o6 k) [9 m. s7 _8 a* S
#include <unistd.h># @0 z3 l8 q6 @; l
#include <sys/mman.h>
! \+ z, k4 w, T: V! U' Z- R! w#include <sys/types.h>
5 Q% J! U" }8 O#include <fcntl.h>1 c) n* \  c4 k, w
7 E8 h8 d4 z1 Z3 s
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
/ Y+ o- E0 Z' M" T  R+ [) |: K3 P6 p- b' D/ f* _9 e% I
typedef struct
. a$ X# d9 D1 b0 m# D{
8 \0 m6 x8 F4 {0 i. {; g- m2 K1 ~5 M        unsigned int a;
+ y) M0 d9 U9 D( [* D$ l& T        unsigned int b;
! W2 W- S8 k3 g/ N# p) C        unsigned int packet_cout;
# c" o- z7 i3 Y0 ^' q! s  k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 z# H# k2 r1 [* n

* K0 R/ P+ |: U8 O0 bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 N+ W% b8 ?9 o: k( zunsigned int count_copy = 0;
  a& U# X) n" I) d3 U( N: V6 C& `% m
7 h! c5 e$ o8 r
int main()
! L. [& r& h6 @' w  n6 z6 b{
+ J6 Q' d8 o! ?& u6 Q        pRX_MSG_PROTOCOL pshreRAM = NULL;& q/ q& |, g- m3 `" `! O
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ Y/ D9 V7 G) n

; T! v. C4 \6 k8 T8 M) l        while(1)& x& [; I6 |2 c5 @/ V, S4 x
        {1 ?, [( Y' W3 T; Y% A1 n9 W1 _* b
                read_MSG_buffer(pshreRAM);7 e7 x/ a; m, ]) U; ^5 C2 Z6 T
        }               
4 e; s4 B( @# J3 i0 h6 w}
% W6 t. W% ~% {2 s0 J' L6 K1 Q2 B' ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( P" e( a& D9 _{
$ D. w$ i; V$ ?        RX_MSG_PROTOCOL buf;
5 H# P& L" X' v! H% s, A        
. W& f# W0 R& M' P        buf.a = pshreRAM->a;+ C2 x6 i/ C/ o: L: Z
        buf.b = pshreRAM->b;
7 s" k% U) [6 g) W$ [) H3 c        buf.packet_cout = pshreRAM->packet_cout;0 j% o2 C3 n* \7 A
        3 a" D+ s7 J5 n
        if(buf.packet_cout != count_copy)7 s2 y6 ~4 S: g6 F0 q2 ^: m
        {
. \8 I+ ~/ K5 ^! W6 T                printf("a is %d\n", buf.a);
8 C1 \: q" L1 V" ~2 p5 y                printf("b is %d\n", buf.b);
5 |& S+ n. j/ z: s+ V9 O                printf("count is %d\n", buf.packet_cout);( M. J5 a$ |7 O1 @3 B8 y
                count_copy = buf.packet_cout;
6 U! z# F+ j5 f) h7 @2 e( ?9 A/ i9 _        }
3 U" ~4 W4 B0 ?) N% e( U  }        else3 I  |# w# O8 O
        {
( R$ `7 R% a5 p                printf("No effective message!");* C* ^6 m$ N; f, _1 ~) c/ z6 K
        }: d! b% L/ B2 J' C$ ~4 H
}
; L9 s- h& N7 u# g2 i
# j& q/ ?% {6 R: _7 G
: z5 m4 l/ U( x+ `但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' M& G5 H* V& H1 {# @& q使用下面代码,对内存使用了mmap函数后:
8 @0 o- m5 ~4 T8 ?8 K5 Y5 S#include <stdio.h>
, l3 A! Y; y0 Z/ M* E2 j  l* M3 b: ^#include <unistd.h>
; E6 f7 l1 p) `# ~#include <sys/mman.h>
& j( w1 ]. H9 F0 H# P9 d% v9 D' o#include <sys/types.h>
# K% F' `/ E/ z  g) V' K#include <fcntl.h>
* R+ Q8 x# o' X$ w* x- I- r+ f% u5 }1 d! V1 u  E3 r, m# T
#define SHAER_RAM_BASE_ADDR    (0x80000000)
+ D8 w+ B9 e% y/ e6 m+ K3 r#define SHAER_RAM_SIZE         (0x20000)   
' m& T2 ]1 z' x) u! s2 B- v1 J$ [/ u# R
typedef struct( H& r7 b9 m, O8 G# N* X
{: N/ u) K! Q# {8 p, u/ V
        unsigned int a;- E8 b" ~3 \9 @9 P% V2 T+ I0 s& l% R
        unsigned int b;8 G2 |4 e/ @' b. f% a% i/ q) o6 J
        unsigned int packet_cout;- @1 v/ _4 E6 ^; @0 \" L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 D& |0 n( n# W; @# A+ o! t5 Y7 _2 R) _
. ~2 k( {5 L# n/ W+ E( Avoid read_MSG_buffer(int *baseaddr);) i1 s4 m" i, r2 E' e
unsigned int count_copy = 0;
# N% c0 Y$ J8 `' U! _2 A
$ F9 O6 Z+ n' k% C) i0 aint main()' n$ K6 U  p. r
{/ K4 n+ S! a3 R; O# a+ K) M
        int fd;/ k& d9 w3 j* c
        int *mem = NULL;7 r7 E$ h2 ^+ e. s, H/ o
" B, E! p* o4 O! K9 i
        if((fd = open("/dev/mem", O_RDWR)) <0)
& V8 n6 G! b, b5 B6 r5 p        {+ Y, ?; H3 t9 h% M. g8 j& }% ?
                perror("open error");
( E6 p2 j2 V' q% {7 d. N, W4 h                return -1;
5 g' h; s* D4 V+ {; d        }! n& a! K% @% Q! z/ l
        
3 {- P4 Q& y8 v6 ^! ?( p        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* Q) ?# T/ p6 ^; ^& w
0 v2 H4 K8 `: Y7 b1 ^1 Y        while(1)
, N) R  {$ H; \+ Z6 x3 F        {! z+ W: `) [( [3 Q
                read_MSG_buffer(mem);' L  j# N" l3 Q% u0 O3 l
        }               
& u" \% K. {, M+ I9 ]% t}
8 T9 _- d. f  t
/ k% ]8 u; P# U+ b# Avoid read_MSG_buffer(int *baseaddr)
+ b! a) n* s8 G, K% F* p' N' A; w% w{$ s& M6 ~: C; J) A- @) f2 I
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: L/ b- J! ]- v) n0 G& O; k
" l3 ?, b5 t- [        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* r$ I  n' x# \: K

+ L( A) T/ h- m- M, I: G        if(pshreRAM->packet_cout != count_copy)
* x+ V  l& \5 {( B2 {        {4 a# A* c! q  E# c+ \* s1 v
                printf("a is %d\n", pshreRAM->a);
5 K' Y( L) ^: M% W; O* r                printf("b is %d\n", pshreRAM->b);  z8 N( Z7 R$ ]% _/ U2 k
                printf("count is %d\n", pshreRAM->packet_cout);& Y1 ]9 X9 \% f6 V2 N
                count_copy = pshreRAM->packet_cout;3 n0 Y7 p# R# x# Y5 W) p6 v
        }0 o" i  U3 G5 }/ u3 T+ t% ^
        else  b1 o! [3 l# V/ W
        {
+ K% v4 ~  D; `9 f( n' b3 r5 M  N                printf("No effective message!\n");
! t$ ?, \1 v5 G+ J. v8 p/ d! F4 w        }
2 H" |# d% D4 d9 x4 q2 M}4 B  ?' O- g$ J& r. a2 T

& {  G- ^# x6 }  W8 V3 a8 F$ i没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
  L1 O! {' S7 q. N' @- P; p/ y, V6 o) W
4 @$ q5 u" t% j$ R5 I' J3 I2 Q4 {1 g+ P

. J8 ?# V* n2 @$ ^" J7 t2 ^
* ?- }- S& q! Z  n




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