嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 X& q: t6 Q5 x" P$ v" j% t  }- Q, D3 Y/ J) w
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ b; b- ~% ^  r' a! `2 `9 Z#include <unistd.h>4 `# B: Z) s3 c1 [' b! K
#include <sys/mman.h>
, A8 E/ i1 f- W- L#include <sys/types.h>
+ {+ q/ {+ V3 T5 X( \. h) @#include <fcntl.h>" t1 O+ A, t( n8 z

. R0 N* I+ [8 q6 B" Y#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* n  y1 r8 q% E: a; c! ]: N. z% _5 A* v" L
typedef struct4 i! B* }' x4 v
{
; h0 P! P# C: K- ^6 ?        unsigned int a;8 i: T2 O- l' J! A9 f9 `
        unsigned int b;
: a4 _4 f% [8 M0 d/ l        unsigned int packet_cout;5 A- g7 v. }* {2 b* y7 f) p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! S- L; Z4 k1 O' ~( E5 f) p' J* r9 Y7 h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 |8 E! b3 Y8 |- k& {unsigned int count_copy = 0;0 V$ a% g; {$ H# W$ P; |% o
1 i: E) ]4 W) S9 ^; J; M* u& [1 w
0 _5 z1 ^' G2 B
int main(): G9 x& T" ]( u2 Q: y
{  p/ m& u3 N" q' l8 p1 K' E: C
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ W9 `3 S5 d! J! e! M
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;& n$ W, x" ^0 }
- S' T, c  L/ o+ [5 L0 E! ~6 c
        while(1)2 b1 d0 `& t; g" ^, j" u
        {
3 N) z  E# J( x  S/ Z                read_MSG_buffer(pshreRAM);4 n6 A8 l  u( s0 I- Y
        }                $ q8 L/ }( a9 y" e$ X! v
}7 o7 x2 h+ n2 R. Z( h

5 a" f) ^* d8 d( ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& W4 F1 }% z$ r; E$ r0 d1 j* y9 q
{# B7 H: `% f/ S
        RX_MSG_PROTOCOL buf;6 H$ M' P1 P' v( h5 e+ K
        
) ~( f5 l. U( P/ N5 `- J8 @        buf.a = pshreRAM->a;: m( e- h$ F; B- Z
        buf.b = pshreRAM->b;9 Y) q% Z/ Y6 R' S
        buf.packet_cout = pshreRAM->packet_cout;* V5 J: l; z% W; n5 i' f5 B8 f
          D3 n$ T" m5 l7 @
        if(buf.packet_cout != count_copy)
: m8 P. L* z# A0 F        {
- s( S2 U/ n1 R( \, i/ r                printf("a is %d\n", buf.a);' G4 a  _+ D( N( A0 b
                printf("b is %d\n", buf.b);
/ h! ]. ?; P$ _                printf("count is %d\n", buf.packet_cout);
' E. U9 G* P' O                count_copy = buf.packet_cout;
3 M/ R* J5 s  i' m( V        }
& ]8 D" P8 A  J/ {, N4 U        else
$ l' g, f" B6 w$ v! z        {
3 c  z$ ~- c2 {                printf("No effective message!");
% K! _& I8 M3 B( |        }- l9 g1 S* V  A/ z; w. c
}
& E3 B- [9 ]! ~& G5 h6 C
: [+ l! u1 S3 [
0 ^$ S7 h3 _. f' W" l5 ~4 q但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ [' l/ M; O6 G
使用下面代码,对内存使用了mmap函数后:  ^$ H6 \* L$ K+ y, [
#include <stdio.h>
9 H  C5 i: A4 u8 f/ b6 j4 q#include <unistd.h># _, C$ C6 ]5 p3 B
#include <sys/mman.h>- c5 k+ j2 s1 f5 q8 j6 ]
#include <sys/types.h>
$ @( ]% y2 F" [/ E" a% R2 u% A#include <fcntl.h>9 t0 x) x( [- k' z! \
! E9 ?# a  S, w7 o* _& c
#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 p& B7 J2 B$ d/ k9 X  D#define SHAER_RAM_SIZE         (0x20000)   ' j& ~! B1 i/ @% I

+ v( a6 f: o+ ^9 Itypedef struct; G8 J: @# B7 h5 t  ?7 a5 B
{% Y8 u- p& G) m  M. ]0 a& R
        unsigned int a;, L7 t- N; l9 C- O
        unsigned int b;' b0 H5 u# V3 h3 |/ Y3 w
        unsigned int packet_cout;
/ }1 F. D+ {2 z& a4 n* {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- A8 X& P- }; N/ }

0 k* H5 h" r6 C0 m8 Ivoid read_MSG_buffer(int *baseaddr);
+ F0 i" h% @8 t# Wunsigned int count_copy = 0;6 y2 k* X& Z# `3 ^6 c# [  e
3 A9 i4 v$ s" T- h( m% a! ]' m
int main()
& L6 Z# H3 y& x# N7 U{
! x+ s) c: N$ C2 i        int fd;/ e: ~/ {$ u% k1 l" i5 P
        int *mem = NULL;
7 X- C% \% ?4 H8 j. N
/ O- ?4 d- d& N; e; ?5 E        if((fd = open("/dev/mem", O_RDWR)) <0)0 s8 Q* Z, u% n6 P! s) h5 G
        {2 y- N: _6 Y, M! J$ P, A: P6 ~: @
                perror("open error");- o6 `! j! \; O5 }$ X3 y5 L
                return -1;5 {# u  ?$ h: i* N& g9 [
        }
" r9 a. ^. b5 P" y, H  H" e        
! M! f) X. z; O# ~8 w4 W        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 s) W. K0 m& J0 c1 L) _  n
- D5 W! Y& ]" e! R/ q8 ?        while(1)
$ |& @5 ^* H- I6 |/ m        {- `! D1 ?5 C. ]' N3 {$ c' f! n
                read_MSG_buffer(mem);( [2 i5 i* q+ I& A& C& W0 t
        }                9 Y% \$ ^, ~9 m* `; i5 w
}
0 ~; J" G6 p' S
* J. p* s7 M' g' svoid read_MSG_buffer(int *baseaddr)# @1 o0 J( m$ w/ C) s- _& J- `
{
5 D9 p  Y) N' P, }, T% g2 I' W        pRX_MSG_PROTOCOL pshreRAM = NULL;3 b3 G  O* w; r4 ^9 X* e
( v+ C. ~7 ^9 @
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 |# B' G' D! `( w7 u
( H. B# {) ]: b* T# B5 b        if(pshreRAM->packet_cout != count_copy)0 Y7 U. U( K, y, R1 i: c4 s  M
        {9 \, i# [1 h) p% p3 {
                printf("a is %d\n", pshreRAM->a);5 b' ^! K: w  ]5 W. C5 _
                printf("b is %d\n", pshreRAM->b);. r( N7 R. t0 P# S
                printf("count is %d\n", pshreRAM->packet_cout);
2 C" K/ |3 t! ?                count_copy = pshreRAM->packet_cout;
2 I) |2 B9 p! U; [! r7 I: _        }* U, |  f& K  d- A
        else
0 B4 t* v: R0 O4 y1 }6 R        {
* O% ]' A9 V. t                printf("No effective message!\n");
0 b; C* W7 e1 T; r        }
! \( A) }; B' d, u" z2 k$ t/ L}
8 R7 l2 V9 l4 O8 X. G
( r- @8 n+ l# b3 A+ Q没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 i) K0 p2 l  x2 l. }7 G% j- M3 e0 |
0 q- S8 q  @$ X

; d5 i2 `1 o" K- P* t% c' V- Z4 E4 S4 E" w% Q' I; L





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