嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ p% d$ `" m  m. m
* H+ {  R0 V* j7 H% Q6 w0 U- bOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>  x: b7 I) E1 X1 k  q7 N
#include <unistd.h>
- V. ?' T+ z4 ?% S. b#include <sys/mman.h>
- {! u- H9 W, T: n  X9 m! F5 D#include <sys/types.h>
' I* r! X! G# u! m* W" f/ i#include <fcntl.h>0 ?4 ~4 R* t9 m
8 P: d( }+ f1 G3 \- J. E
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
! J$ {  M+ |# v& T6 g- |+ K
$ h% j8 [- f& @2 Ttypedef struct8 K( D+ Q0 S% M3 p1 G
{! X8 ?+ S* }, W2 ^( a
        unsigned int a;* X, J0 r7 q6 S/ k! ^$ P3 i
        unsigned int b;$ o* l) @+ H6 V& N) u( g
        unsigned int packet_cout;0 m+ S; n! B% w" |/ P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% A1 h# p8 |1 Y* |7 {! r
0 f: u! f3 A+ C4 _2 a( Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 [# L( i7 |# F! d$ i. ^' _5 Iunsigned int count_copy = 0;$ e: D: P* J) s3 r- Y( u" W* [

  N! ^. Y  A0 a" [' m2 S4 i4 j, @+ ^. r- H+ U. }  J+ g
int main()
! ~1 c2 g  q# v$ _) w9 H9 W9 j7 U* {{1 I) G" W1 Y4 o/ }2 Q' ^# ]& h
        pRX_MSG_PROTOCOL pshreRAM = NULL;% a( `# U4 `" h0 W3 b% W
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ v: J% _: Y& H1 i$ w5 |/ W5 L* Z& a: z/ m; {$ e
        while(1)
: {( X; r+ K7 Z8 Z' f  V        {9 {. |, F8 O( F4 c3 r
                read_MSG_buffer(pshreRAM);' h# o: @+ h9 I1 o/ E
        }               
  L5 h' y1 x0 t, B* U}, p; o8 M! A3 P9 e- J' c' X

( D9 ]4 a; u& }  R; }  K; U, pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 W9 R8 ^) L1 ~# L& N3 P; ?9 K{
4 A, W3 V( D6 b5 t% d/ p% [        RX_MSG_PROTOCOL buf;- W) r% k7 ^- j: V0 {7 @& R
        
. o6 T& L: W; q/ Y  F        buf.a = pshreRAM->a;
* x2 h0 C2 z0 }1 I$ u4 ]8 H# L        buf.b = pshreRAM->b;. _, H/ I9 O: ^5 u! B; {
        buf.packet_cout = pshreRAM->packet_cout;
4 V; r9 e- [& `        
* `) }" X; k: S5 ^% @        if(buf.packet_cout != count_copy)# P) K2 @* I5 _5 i  I! d$ D3 n
        {( W$ [* L; \2 d& a4 [1 I) N4 K7 [# i% x0 I
                printf("a is %d\n", buf.a);6 d' e# }! ]0 x6 c+ H3 D
                printf("b is %d\n", buf.b);
& H/ s1 N6 R; F# x                printf("count is %d\n", buf.packet_cout);1 q- [0 x9 Z* J! n
                count_copy = buf.packet_cout;9 R* i9 ~8 B5 ?* C
        }
5 P9 V' h# }* _. H- Z        else6 N  Z+ [1 i- L& S! n- P
        {
9 @/ ?! S  k1 x' |                printf("No effective message!");5 w7 Y: ^0 `+ A( Z- f
        }  T9 s# S) V  c5 e, P% R6 Z
}# b2 G2 m5 y" H* U$ m
, L5 U. y4 P( B' X; `+ G8 T
8 S  b  b' X* _- r6 z7 v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* `5 `. G/ m7 N1 z2 q# u$ G' Z使用下面代码,对内存使用了mmap函数后:
) \4 p' O1 W) R( S7 W1 K#include <stdio.h>
$ C/ ]/ S$ J) v#include <unistd.h>
. e; @1 u( Y6 ]( u7 _#include <sys/mman.h>' [/ V- q+ Z+ W8 h5 q. j7 }* Z
#include <sys/types.h>
  g6 j) _  K& G, @. L#include <fcntl.h>' n9 L$ g+ k- R0 q3 A  h4 f5 R

" Q8 ~' r% p) u0 C2 l/ D2 B#define SHAER_RAM_BASE_ADDR    (0x80000000); q. e3 R7 U) _3 u4 y
#define SHAER_RAM_SIZE         (0x20000)   
+ X. W# U! A8 I+ H8 i. y* j: |3 ?
+ ?  J9 p5 {. l7 r% Ktypedef struct: J- d& j0 ]: w5 C4 }' J) ?  ?2 m
{
  i$ W' n- W3 Q        unsigned int a;8 a8 U! `7 b- e/ n* w
        unsigned int b;( ^, B" T2 h: m) J& I" a# J
        unsigned int packet_cout;' R; ~1 t* x; ]& S& I3 ^8 V- y' o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 A5 j; L4 G# T1 T% ?# V: ~
7 @  }+ E: X4 S# R& ]: e7 G
void read_MSG_buffer(int *baseaddr);: c0 O. B& U+ e+ W
unsigned int count_copy = 0;# \# R0 ~; w& _. J

9 ^6 T0 f  g4 E; S, z7 \% `+ m3 rint main()
, l# }' V5 p+ H{
! m1 `* t$ G4 @1 Q1 \- [        int fd;
+ r2 v% I, e" }7 U5 F7 {5 ^        int *mem = NULL;
  f/ @3 V( {& C, g
+ o# X5 K- G* J0 s& a        if((fd = open("/dev/mem", O_RDWR)) <0)
) g: [' k! E2 M" @        {
+ z% Z. X, v/ O+ A+ l& v5 l( ?, E                perror("open error");; x1 l6 {9 L" }
                return -1;" N, t. n: m0 Y5 s. \8 l! A
        }
8 T* a5 b4 ?4 I        
' e1 `; h- J: k2 }* @) O! X  v) y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ h4 S$ c; k5 L2 T% T4 H, j
& c4 o+ J( C8 g. S1 G. g        while(1)
2 [2 E( b0 q' w9 w        {
5 I, z7 i: O6 c' V8 ^6 P" r                read_MSG_buffer(mem);( x/ y" `! x# h2 Z$ B, e. g
        }               
$ I- s3 h' Y4 H8 D  ?$ Y1 `}0 L: w9 ], S& s

: ~$ Y+ c* ^2 tvoid read_MSG_buffer(int *baseaddr)
! K* B7 g3 x; Y8 o{' Q9 C$ \& N% z3 c! F5 `
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! d: v! R( [" _0 E0 w, a+ l7 A
' }3 F5 t8 ?; E, G1 `        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  Q9 L! z+ y3 g" b% ]6 ~" d. D& {$ A' u. G7 M3 Q
        if(pshreRAM->packet_cout != count_copy)
9 B7 c$ A. _9 S. k9 A        {( D, e3 v. n9 M' s, e
                printf("a is %d\n", pshreRAM->a);
6 g. ~1 H& a. a9 S; s7 a' [0 [                printf("b is %d\n", pshreRAM->b);
& [1 F$ G9 ~" L( Y# Q( m! o                printf("count is %d\n", pshreRAM->packet_cout);
  w* q* W+ K# z: _! \9 P: q; q8 l                count_copy = pshreRAM->packet_cout;5 z# D6 q2 K2 }! ]
        }2 a! L( b0 P7 F7 w/ o
        else1 x: T* c4 j+ P3 t
        {% c+ S, A& y, c0 S- K) p
                printf("No effective message!\n");
$ B& O/ K  Y$ k, D! w        }2 `  h) F4 _4 `1 ^  ~/ u. K
}
; w9 g$ O/ d6 X2 ~& l4 [6 A* ]5 S* x5 D5 E6 B, @
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 Z  ]+ W' h' G. H- m/ p  u! E
) L% E- f9 _. S* N
& q! j( v' y* b  B4 {& P
% f5 }1 q8 h$ N% Z2 s  s6 G% \3 V
' D# p& p' `  Y2 [2 f7 A




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