嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" B) V$ j5 C* ?. T( f6 n/ X6 Y$ V! r& |2 y& L) T" h' ?
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 [9 y  ^& w. R#include <unistd.h>
; C; U# Q" @! q2 _#include <sys/mman.h># c1 C2 r" x. t+ [
#include <sys/types.h>2 Q! K5 m' z3 V4 O5 Z7 x" M
#include <fcntl.h>
3 D1 F; U, @) M0 Y; P' e( @$ D7 B2 X6 [
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
/ ^% ], g. d* S7 c' f  r( @* q9 h- _! V+ {
typedef struct
/ }1 n7 `' g1 ]" r  q5 S{
& e, |% O; u: T4 ~2 P9 s; K  N4 Q        unsigned int a;2 q! K5 T" D; H- @( U9 ]
        unsigned int b;1 l8 L. X1 i; v; S7 j8 {1 B
        unsigned int packet_cout;* x2 T  ?( _6 F9 @- h5 Z0 ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ H# b7 v/ S5 m9 y! Z$ Q
, M2 ^7 \+ {+ J+ M1 A0 n% X5 t+ V. O7 d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) U5 y6 W6 u9 [
unsigned int count_copy = 0;
$ J- b! z0 H* J# U( @$ O: ~! h# o" I! d( F# m9 k* d/ G

, J' \, w- x' t4 Q+ Oint main()
( H; \6 r, v! Z# i8 q# w7 \{
6 R& r1 u& S- ^- s        pRX_MSG_PROTOCOL pshreRAM = NULL;, x% D8 O6 R+ ?, P
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 G& V9 l$ }2 \5 a8 G+ k( y6 |8 F8 D3 N+ t  S+ C
        while(1)
6 ~5 d" x( `. y. y* Z        {, H( J) E( D" g8 K) Y- ^" S. S
                read_MSG_buffer(pshreRAM);
( q" k* E/ s. M0 A        }               
* l/ F; z( ?3 i+ m) A1 k6 L4 t$ M}
4 [2 ~' _9 ]- }+ ]" R8 Q! L: f1 `/ A# a1 m8 L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  M* F  b$ E# A4 P9 E4 P{
& c. W$ E( q4 J& q        RX_MSG_PROTOCOL buf;
5 _& L6 t; m, W2 k  x! y7 j% _6 O        
: A8 w" w* A' W# R) j4 o        buf.a = pshreRAM->a;
! h# d$ Y1 r& g* x; i+ a) j        buf.b = pshreRAM->b;8 j1 Z) B( ^' c4 M2 ~. d8 A
        buf.packet_cout = pshreRAM->packet_cout;
- Y( r- H0 t7 |        ' M  |* b/ f0 [7 G4 q0 k% m
        if(buf.packet_cout != count_copy)
. v: a" A8 b( I4 J# n        {8 L0 r3 c/ [3 q+ C
                printf("a is %d\n", buf.a);- E% U  i7 T+ L
                printf("b is %d\n", buf.b);$ c* G+ y+ |/ \& N% U7 ^
                printf("count is %d\n", buf.packet_cout);( @; m3 Z' q9 ?* k( L: p
                count_copy = buf.packet_cout;3 V0 @" ~" D, \4 Z
        }
7 D" g3 Y' y/ O# I3 m4 [# C% v        else
5 W2 U: J2 b0 `        {; w+ _8 f' q# f" P5 I0 G) d; V' p1 j
                printf("No effective message!");" h8 R" e3 F/ d; S) I  P
        }% F4 X! Y: G9 Z+ w' g# l
}
8 Q9 P/ h+ w7 T* P3 p
' }8 j4 N  V$ `2 e* {* p  K( a- x0 L1 s; b2 A# I" }2 o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 ^- Y+ O# ?- t6 d% X  f
使用下面代码,对内存使用了mmap函数后:) Y% z  s! i6 O
#include <stdio.h>
! B" b% Y& `4 K+ I#include <unistd.h>, b# c  B, y" }. ~
#include <sys/mman.h>
6 h  C/ |9 y+ r& e7 U; g; }* G#include <sys/types.h>7 }3 Z3 q0 c5 ]7 i
#include <fcntl.h>
0 p- o6 ?3 X4 i3 g7 `5 X
* @: i% h3 ], D+ P% c#define SHAER_RAM_BASE_ADDR    (0x80000000)
( r# }5 }& t) x% v#define SHAER_RAM_SIZE         (0x20000)   % K: E  a, ], `6 f; U
5 k; }0 ^% u! n8 ~
typedef struct, V) V- n2 \4 F% E# t
{
2 _" K5 D- U) B: T" t        unsigned int a;8 `" V% J5 ?2 U9 l& r
        unsigned int b;
; k  }8 a0 P" Z. q* u& p        unsigned int packet_cout;
) L4 X' d! [9 i) t8 P7 ]2 r3 Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 A: f1 i( w3 O* T4 q- `4 j
5 E# c8 J7 E; @! _void read_MSG_buffer(int *baseaddr);/ h7 |- f; b0 d1 ^9 H
unsigned int count_copy = 0;* p! U+ \! J1 @2 k
0 w9 a( `* T0 a3 z
int main()' _5 M9 ^5 W  V9 f. o& u
{
+ r7 x1 ^3 i" n0 u; Q! z        int fd;- I& P4 v$ U- f
        int *mem = NULL;
2 C4 o6 I/ a2 m% q. |2 s1 E* o9 L* P/ i  I* i/ R+ x. S5 y
        if((fd = open("/dev/mem", O_RDWR)) <0)
7 K& X7 K9 H/ @; Z8 ^$ h6 Z        {' t9 ?& X8 n) n5 Q
                perror("open error");. `! `' w& B' U! A- z
                return -1;
' ]) n/ N. B- E" q( Z& Z        }2 b- H6 w0 V: ^9 J( n
        
+ K9 @# j+ F: w# X7 N/ e5 D% @        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- K# {5 ]7 ]$ I4 {4 X/ l

9 R$ e0 ~9 c, Z; C/ P        while(1)/ B9 _3 X, f- a7 c) G5 }
        {2 F% J& p$ j& G$ r$ B1 D
                read_MSG_buffer(mem);
1 [6 ^) K7 M: b( N2 p+ e/ @. [        }               
4 g  Z& \& q+ d, \}
* f. P, \: u4 ?: N1 H  ~. m- ]6 Z0 }0 b
void read_MSG_buffer(int *baseaddr)
* r! B! P& n8 e8 ]# X6 B9 _; l{
& C, k* l/ p5 |/ Y! s  J% K& `1 y        pRX_MSG_PROTOCOL pshreRAM = NULL;1 a$ ^, c. q2 `1 z

% F4 q) k! w: j7 x        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ |9 g8 T! H( {0 T, y: O2 f6 O3 q1 x: Y+ ]7 e9 V$ G7 k
        if(pshreRAM->packet_cout != count_copy)
" Y+ H, z& h1 u. ?3 c. P0 D) o        {1 {7 @' Y* q) K, v
                printf("a is %d\n", pshreRAM->a);
! q: y' k9 b3 Z( s                printf("b is %d\n", pshreRAM->b);6 B/ U0 V$ p4 a) s, n  c4 ]
                printf("count is %d\n", pshreRAM->packet_cout);1 }, ]: M: _/ S
                count_copy = pshreRAM->packet_cout;9 g. |1 l  V9 N% @
        }
* c6 ]6 r3 Z1 R' _4 }        else
3 m. X6 _: b) i( P/ O        {6 S8 x& [1 f# {4 C( m4 }
                printf("No effective message!\n");& `+ v' u: h/ x0 [$ h
        }
6 W" R( \+ ~; M}5 J( y" {+ f3 y

* J% w" R" i, d! j没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 u) q0 {  O0 g7 k' l* S2 A
+ ?$ X0 U- K1 q$ b2 t+ H
0 \2 N- V' v. c5 H

9 ]# b7 d# ~4 d/ {7 w- O# D6 f, m. a





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