嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 a. n' n9 H7 I! B$ B. e
. {3 v% M- X% k, Z  E5 D) }, x) E
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 S" x5 Z9 }* y& N( V+ M#include <unistd.h>; b6 Q! {# w3 [6 s5 K
#include <sys/mman.h>
$ W( P7 ]% E2 z' e# i#include <sys/types.h>1 q! [4 y; O  ?
#include <fcntl.h>
; C- g/ F0 a3 N5 ?" B% w7 x+ I- U. t( C" X+ g, Q4 \+ F0 r. H: z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   2 u# Z  K2 W( z) E

7 P3 b' f2 C8 Dtypedef struct& g* \9 _; R5 `* G5 ^( s- m& h$ Y
{
( j) r3 @# R5 ~+ Z( u        unsigned int a;6 G: Z3 ~0 J% V* i/ Q7 N
        unsigned int b;
- ?, t+ a: O% h. X/ F7 B& |        unsigned int packet_cout;+ `, T! }! S" O0 x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  l( K& u" [, t6 k; f2 \; Q6 }1 E9 m! m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 x! b' |$ E1 W2 D$ e; xunsigned int count_copy = 0;- C2 f8 J3 a4 Q. u

3 E; f5 Y3 k: W. A5 z- c
( D8 Z( Z# a, m! Qint main(); ?! G! T0 T( w1 ^1 c
{
: Q3 L  m  F. j: B7 Z' a        pRX_MSG_PROTOCOL pshreRAM = NULL;0 {- x6 Z/ I6 V0 k2 n' J+ c
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ y, r! e% e  f1 m: t8 {
( |, v6 u9 w( w+ r
        while(1)+ ]" P! V- \! g, m2 x, R2 z3 i8 e  m
        {& g) C! J  N2 B& M3 F* I+ }: I3 P
                read_MSG_buffer(pshreRAM);
- O# ]' K0 M( q- P. x6 V, ]        }                7 s) O$ c7 a6 I0 e8 ^# L9 g
}0 \7 b& a/ U( y! T

" N2 G, _" N1 k6 t  C, |3 y' |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- }8 N' _- ^$ a+ i" ^; B
{$ J# K6 q6 q( X( z% o! O( I
        RX_MSG_PROTOCOL buf;' h* ^; u" {- z
        
1 H- A# K. E+ \7 d/ g( e. `        buf.a = pshreRAM->a;, `+ j: }' S3 Z
        buf.b = pshreRAM->b;
" o" G! p" J2 V* y9 [        buf.packet_cout = pshreRAM->packet_cout;
* [5 h: x/ X* _7 m        8 z0 j, w+ ?4 S$ s
        if(buf.packet_cout != count_copy)& ~# a6 z+ t2 Y( _" O7 z5 Y/ S
        {
5 b7 O. w  V1 u3 y                printf("a is %d\n", buf.a);  t# m6 a- q% c1 |
                printf("b is %d\n", buf.b);
/ F9 E' Z9 L- }( Y4 P( q' K8 Q                printf("count is %d\n", buf.packet_cout);
, ]7 H6 j$ `% U                count_copy = buf.packet_cout;9 S0 S4 E# t. }- U6 T5 O7 ^" s
        }
9 \0 S; q! A4 y; H: h% _6 u        else# l% u; ^' _; V& h- G+ [( N1 h; r* Z
        {
- {1 j6 ]5 L5 u7 P8 a4 {1 A                printf("No effective message!");
# q# m& ]# w* |( r  w9 S3 `; c6 g        }
& J  G) l7 V8 ]8 ]# x3 h8 ~& b& y}
' B8 K2 v- v; p$ O; D$ L: r$ a

1 @$ L9 R4 T' ~1 Q3 B6 C6 k但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ e; K3 e# \! `* E; [
使用下面代码,对内存使用了mmap函数后:) L* R: ^& Z6 C1 @% {, |7 e
#include <stdio.h>
5 H5 t, s) _% ~) W#include <unistd.h>
0 [( H( z, p3 {3 _% s8 t8 _#include <sys/mman.h>
" ~9 V: b/ t( z# j$ Y9 o* b4 y#include <sys/types.h>
" T$ G8 u5 u/ Y1 |#include <fcntl.h>
& F  z. m2 y* |7 y& y6 ~* U  p4 P! @& ~- F2 b4 \4 n
#define SHAER_RAM_BASE_ADDR    (0x80000000)  P3 {" _  L  ~# `# ]  D
#define SHAER_RAM_SIZE         (0x20000)   : r! c% K0 M3 w3 u7 Z; B$ M
% p* m# {; ]1 \  Y
typedef struct# B3 e3 W) r/ a. f7 e
{
# A2 g5 }9 n+ N+ C6 }5 P        unsigned int a;$ D3 S* D5 Y% t, R0 l! D# ~& r
        unsigned int b;/ P4 Z3 I+ N: }. q
        unsigned int packet_cout;
: V) J5 k. V' X3 ~0 I+ T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  l, N; H+ s: I$ L/ G* N; z
3 ~: l9 N+ Q; k' Ivoid read_MSG_buffer(int *baseaddr);
  ~& b. T' {& z6 \6 k; tunsigned int count_copy = 0;0 }& v9 n, J/ d

6 r% {2 e" [6 Z# J* m$ D, X' Q0 dint main()! S! j9 j/ x( p$ c0 r: ?$ o! Z
{
* n5 p4 d6 t2 x$ C        int fd;- q0 j2 r$ ~/ C( U$ `/ [
        int *mem = NULL;
& |( W$ \8 M1 s( x9 `) x+ K$ H4 _9 t; C4 q" U' m
        if((fd = open("/dev/mem", O_RDWR)) <0)
; E1 V* g$ P: K# \! C  f4 d& h        {
5 N+ C$ B$ W7 g' g$ J: w) X( L/ J8 Y                perror("open error");$ e5 D* E+ N) v) ?
                return -1;( j) D$ q, Q$ q
        }
$ O3 A1 V% p% h* y0 K3 B- d        
) O! Z: V, i) G& b0 H* `        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);) ^$ b+ [; K$ C$ H3 E6 D

; H  U; y" U3 V4 y        while(1)
, r) f. g( T( B* R& v! C* v( v        {4 H9 R! d& w0 ]- B: q  W) j
                read_MSG_buffer(mem);$ K5 \1 |  x, Y* N7 l: J
        }                3 R: J- A% @; g) C! I, q- U
}
( d7 i( M+ G2 P7 L% D( @8 a3 _9 s& L' U; W
void read_MSG_buffer(int *baseaddr)8 {5 U  A( }. |6 ~( ~6 ^) P+ o
{: ~5 b$ X5 A+ f9 A) m; [# K
        pRX_MSG_PROTOCOL pshreRAM = NULL;' F) N9 i" O& R, v/ F6 D

0 n; V; M2 l+ t' A        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 R, }. V8 h  _7 C& p( ]+ K

4 B# E2 d6 x1 Q$ j        if(pshreRAM->packet_cout != count_copy)1 q8 O2 ~) n1 X% {5 Q7 f9 h; e6 w" `
        {
% T" n4 ?" c& ?& k                printf("a is %d\n", pshreRAM->a);4 y9 c3 Y; f! l1 [2 x3 h& J7 Y* Z
                printf("b is %d\n", pshreRAM->b);
4 U0 Y& f& ~! x4 m& g                printf("count is %d\n", pshreRAM->packet_cout);! W; p: R0 K3 v% |* A; U$ N* L
                count_copy = pshreRAM->packet_cout;
9 s! k- Z: J) I% z5 D        }; M$ s" B: O6 Y) b/ j! ?# |
        else
2 m8 B8 T$ h5 l9 C7 S! Q! N        {, }7 ~- P6 x; J7 h  B1 Q1 H# Q1 m9 o
                printf("No effective message!\n");
2 y7 F. p  Z  M1 n* P/ ^+ G        }2 l3 A- O9 G# P5 S: T' f
}
9 P3 o  ^2 X6 m( n' {( T1 h3 A. _2 k7 C/ |+ D- ~; k, l
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 t% \7 Y6 e9 _4 ?3 [2 x1 t6 L% ^9 H2 i  k
* @# P+ F; l* A

. U* e7 h. H7 v) Z1 I; O, h. g$ q! G8 _- S, O1 W+ T1 X" A& g% ?





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