嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! o7 }! b# a: C

9 C8 F5 H- V8 B( r' @  COMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; u- T9 W! F/ ]#include <unistd.h>% P$ G3 b+ m/ Y- q0 k0 A5 B
#include <sys/mman.h>
# w; m) h1 L. a/ w' {#include <sys/types.h>5 H7 a5 x1 v$ z8 S* }9 n
#include <fcntl.h>; v" y+ Z8 |% D

( T# E  F7 [( p' D#define SHAER_RAM_BASE_ADDR    (0x80000000)   / k  A$ n6 w, w5 |' F

% |2 Q% `) N3 S  rtypedef struct
) g; J! S$ h0 j" t# V{* p" n& |- G4 o; ]* E' ^& m
        unsigned int a;
3 j( e; }; B4 q: u: _6 Q/ A        unsigned int b;
( G5 I6 w; I( A) o- X: f. U, v        unsigned int packet_cout;
3 k6 ~3 t1 |! Y: J) c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  I" W  j- F' R" Q' T3 B
) I% o0 c! H) svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' d  W- N  b, A1 j0 `; x9 n" C% Q
unsigned int count_copy = 0;+ ~3 z6 _8 `- V" G
" g& w$ G+ {" E! v2 e5 |/ {- m( ?/ n) q

8 o' |8 u6 z) e5 Mint main()" b; A6 U) ^1 g- l/ C1 L6 \
{* g" k4 h& v) `8 i0 b0 u  |, O
        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 `( L# z9 m/ f0 y1 G        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' w+ Y6 I  ]% X# v( L6 B; n
4 P/ v2 u! i' V9 Z. r4 F0 E8 g4 ^8 z
        while(1)
+ S! l6 G5 [& ~* U0 Q        {8 f6 }: |  F1 F  u2 U
                read_MSG_buffer(pshreRAM);4 @9 |( ?% j* w5 M- U. {
        }                4 X- j% ^7 |1 R% Q# h0 f. `
}* H/ o  V* q' s* X1 W2 K5 K& X

$ [9 a$ T1 z! J0 l( X1 g, {$ uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ E  i7 G, ~8 ~( R
{
1 Q. {# O6 `) f/ ~  P8 n        RX_MSG_PROTOCOL buf;* C! q2 q: G6 x, M2 |* f
        
( m: X- q; ~& e* D" p        buf.a = pshreRAM->a;; R  u, N  z8 R$ U6 m
        buf.b = pshreRAM->b;
* r/ Q- _0 ]; `" y" k        buf.packet_cout = pshreRAM->packet_cout;
* I* ~7 ]! \7 G) @+ y6 L        . H5 o5 D3 Z* O5 C3 u( Z% ?; g; h
        if(buf.packet_cout != count_copy)
5 X# u( F: w' ~        {& G5 k/ u4 M; e
                printf("a is %d\n", buf.a);
. _( g. h  W, F  M1 [) p: k! U& v                printf("b is %d\n", buf.b);
$ p9 M! v5 t9 F% D/ a                printf("count is %d\n", buf.packet_cout);/ D9 y( B( E' X0 e1 B( S6 _
                count_copy = buf.packet_cout;8 w6 ^) j$ u% S  g% R! e% e& Q8 o& W5 k* n
        }. l' M) F  A! f3 f' s$ r( k# d  k
        else. E; W* W1 }7 E$ |- v: N3 D
        {
# j  ]' ~0 N* g' d                printf("No effective message!");
! A1 d7 i1 [; ^- d        }8 g! y6 @6 z  k& D3 ?$ {' e  F3 x
}
2 r2 x! C1 E7 B" N9 s) N  I7 S
- L4 c7 L- E+ J
0 A( R2 ^1 k6 O% U: V0 L但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 }/ ^& S3 d7 W3 K, `; y  `
使用下面代码,对内存使用了mmap函数后:& X* w5 x+ O: p% R2 c/ i
#include <stdio.h>3 T, Z! ~8 T. \9 O! F% ^& O
#include <unistd.h>
& I3 W" P( {0 z6 f- m3 K#include <sys/mman.h>
! y  Z- S' f% y( Y2 s#include <sys/types.h>
1 J. L) [( A! _9 R#include <fcntl.h>0 V0 q' [" N; l" U) E( }& h

9 j4 b% y% S3 p' S$ F. I#define SHAER_RAM_BASE_ADDR    (0x80000000)
) P6 M$ r  y# q6 y% W' L#define SHAER_RAM_SIZE         (0x20000)   
5 }8 U+ V: l0 Y, C0 ~0 @0 L8 l3 d, N% L6 J4 }+ V
typedef struct% H) E8 j: ~, Z. S
{& G+ o) N/ e; d* O3 D5 x
        unsigned int a;" t1 A7 w- A+ n! h5 s" d
        unsigned int b;. J% n$ F+ I0 q7 B9 P9 i! J
        unsigned int packet_cout;5 @' i6 v& D1 }; m& Q4 J4 o8 a" g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: R% u7 H/ G) _+ O( U% S

* _2 X# V. R7 j  g6 Kvoid read_MSG_buffer(int *baseaddr);
6 g7 H# |7 I3 _# `unsigned int count_copy = 0;- U$ @; p& u" k  u

* j6 g* {% j1 y7 P$ @7 m* dint main()
9 N" b3 [! R0 H- a( ?. U; w{
2 c+ t" z# S. g+ @0 q        int fd;
. Z* p/ g6 M2 N1 C. k: Q* N5 F        int *mem = NULL;& s2 A% O. e. A( f' K

2 _* |- e6 a, M" ]" F! Y        if((fd = open("/dev/mem", O_RDWR)) <0)
0 o% i* T! S2 n, D! ~        {
+ J% u) n9 o& G& S1 u- j% W                perror("open error");' e. K& j% z  z% T* y* u8 \
                return -1;8 }  `4 z: I' {5 T
        }& o7 h$ h3 d. c* B/ @) ], F1 }
        
1 t! u( r2 `8 e! Y" i        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 s' e6 ~2 h1 i& N5 c8 n# Z/ s

, k8 e: G9 ~1 c5 u1 L9 ~8 ]        while(1)
: A% o+ V3 ^: i/ I7 l        {, u9 f6 {! p9 {- K' g
                read_MSG_buffer(mem);
' L7 e! {6 @3 q- Z' v        }               
' }6 |9 q0 r* \$ g5 C% [+ L8 ]}. u. K0 d' i+ o% {

) s$ r% W$ v+ d9 [void read_MSG_buffer(int *baseaddr)
. p1 ^, b; S0 z+ U9 w; |* p+ ]{
0 h; f' N, ~2 W( D) x        pRX_MSG_PROTOCOL pshreRAM = NULL;' d% y( E% u: t' U0 ], [3 i

$ M3 F8 V" Y& J+ `/ E        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( w! r7 Y- L( i( X9 b/ R8 r7 f# [3 w2 x
        if(pshreRAM->packet_cout != count_copy)
; n+ A, M& j% h" q/ w) B        {9 R9 j1 K6 H9 u  ^5 k: d
                printf("a is %d\n", pshreRAM->a);
6 w, c) {2 r6 M' T% i! |1 v                printf("b is %d\n", pshreRAM->b);' |. M9 D5 T! K" p: P: d1 C* S
                printf("count is %d\n", pshreRAM->packet_cout);$ f: p4 ]9 l0 T4 v- Z6 c+ K  E
                count_copy = pshreRAM->packet_cout;
2 _6 o$ @% {& m* X" `8 v        }7 E/ d1 T1 x3 Q  Y1 G, W, T
        else
4 f# `6 I& g9 i! y  d        {3 h' F9 @' I1 k0 U
                printf("No effective message!\n");
, {1 A* A, a7 P2 @# G; b        }& B% G; t. d) o& |* h4 m+ b
}9 U5 n/ B# o* r. z" {" V

9 U: Y- q6 Z3 P' z% k- r. h5 s没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ n) z* e7 n9 F7 y( N) j: B$ W6 _4 q" T  ]' n

" ^) S6 A: _. }* \* T' L/ A% P6 J( b, H$ y( @" X5 ]

2 T' F. X7 q* X7 C




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