嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ; z4 ]' T- Q8 @  x2 ^

- [" K$ c" R' s6 B8 L% a7 xOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
  Q6 G. K7 o; N0 a+ ]2 V9 F#include <unistd.h>  w& V- {- f+ _
#include <sys/mman.h>
" A$ X: T8 f! j! w; a9 Y0 p#include <sys/types.h>7 Y5 J+ W  C2 M0 R' B1 |) E
#include <fcntl.h>
9 j5 Q  W0 h! I8 g& @$ E/ p3 Y
3 J+ w" R2 l0 a. o0 Y9 Z% H; l$ {#define SHAER_RAM_BASE_ADDR    (0x80000000)   
: [9 u; ~% W* S- n( N1 N* x$ l" K2 O9 |% Y* ~; X. _
typedef struct4 U' O) h) m% Q
{
& d: }& U+ T; T  g4 T        unsigned int a;$ P3 C! i% z8 _: i
        unsigned int b;
1 P6 o5 b/ R/ ?% L2 Y$ A/ N        unsigned int packet_cout;! L5 [# G) B; b  x/ n3 b1 J8 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" a9 l% \+ T9 v8 ?2 D3 }* `$ R% v, Q
; s2 O; _( G4 u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, b- Y( g# U/ G; x7 ]unsigned int count_copy = 0;
7 P0 {' e) }/ F, v: v% V% C6 c3 Q: w; }3 X% {

) h5 u( e1 r. m/ l3 zint main()4 z3 F9 K2 j& v: ^" R7 Q. T- d
{) [/ o- T- h9 [. {$ @, ~0 ^2 ~# I
        pRX_MSG_PROTOCOL pshreRAM = NULL;6 s% X+ U, W# u! |9 G) B  M# ~
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ S0 N, K" y# T+ _# S( G( s- u  S! ?) r- H- H' k
        while(1)
* b* k9 h0 O/ P' E- |' l7 d        {
8 a+ L; ]9 m* w( p; }                read_MSG_buffer(pshreRAM);4 G, v9 Y) g1 h
        }                3 l0 }9 f" @& K2 t+ e$ i! X4 f
}5 T; y# |; q) @. x
6 P7 Q) Q# a3 }) ^1 F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 I3 `4 G) x$ X: u& d6 c* l
{" H, @" t1 u; X
        RX_MSG_PROTOCOL buf;/ Y/ q6 j) }9 X* i* ?( |- q
        
5 B: U+ B" g' H        buf.a = pshreRAM->a;
/ y, L, p  L1 @* e- j7 ?        buf.b = pshreRAM->b;
/ p2 T; x' k$ q. W        buf.packet_cout = pshreRAM->packet_cout;* m' [+ R# A! F0 y2 {
        
' i# `! p" K( L; C2 {        if(buf.packet_cout != count_copy)/ Q6 V+ i- z8 O+ t' j" X
        {
: n6 ^' `; s; O4 e0 |, B                printf("a is %d\n", buf.a);% V8 s8 W) t+ P1 s/ k. D
                printf("b is %d\n", buf.b);
+ Y6 y/ V% H% O5 F* h  G+ o                printf("count is %d\n", buf.packet_cout);4 x7 ?: j5 D: E
                count_copy = buf.packet_cout;% W" r6 b8 R0 V' p8 @- }
        }
8 N' h) W# ]+ Q        else, c2 O- {- }4 b6 ^- }
        {; l7 X8 U7 R* ]5 [2 X1 M2 i
                printf("No effective message!");  Q. S9 O+ q! W4 h% c
        }! O4 R+ R9 C! k; |) ]/ d. @
}
  h) o+ _" x6 l  z+ Z
7 e3 h; W/ ^% A7 G( R3 T" ~8 s3 i8 [! v$ \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* P3 m  B3 p1 P/ |9 Q使用下面代码,对内存使用了mmap函数后:- S, w+ m* ^0 n; g! u
#include <stdio.h>
$ h% t$ o8 k4 V#include <unistd.h>
* y9 S) Q8 E  M6 r4 s4 R- _#include <sys/mman.h>- y3 l, A, R# P
#include <sys/types.h>
; [7 L8 R- d; G$ h. G( ~: `' \#include <fcntl.h>
, y, g0 Q4 u# k- J9 ]) A0 A& h7 N0 u4 i, j2 E. P7 l4 A
#define SHAER_RAM_BASE_ADDR    (0x80000000)
4 p# n; [6 ~2 G( M7 ~#define SHAER_RAM_SIZE         (0x20000)   
- U8 g6 x$ j) Q* X# l- T% J* _) w7 h6 {. V( _$ C9 o9 f
typedef struct
- ^1 B( R1 V) r8 a; |# E0 {# O{$ o1 F) |# g  e' N
        unsigned int a;
2 X  T) h- k0 j5 L" h/ b. W' D        unsigned int b;! A+ a0 p6 [2 T6 B( a7 L, ~1 N
        unsigned int packet_cout;
; w4 l' v( X" ?6 U3 j: h+ X% _% Y8 f5 K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 a$ h- F( V! a/ }$ z
8 Z  ~: f$ k' v  N( Gvoid read_MSG_buffer(int *baseaddr);
! s7 M0 z. e. r/ Junsigned int count_copy = 0;5 M& Y* }! p0 D( f! ^

8 A$ @. d8 v1 N* lint main()2 H7 j$ J' e# P' k% v; p  B$ b# P( Y
{. j* H& c0 `  J4 z& a$ R
        int fd;. {8 M/ j& [1 ?6 h* _8 }
        int *mem = NULL;8 s, k& q4 G! \% @4 x& o5 W! \
$ T/ L$ q7 U$ j/ v/ x: R
        if((fd = open("/dev/mem", O_RDWR)) <0)+ s- X; H) l' O- R9 L) ~4 A" d
        {0 B: Y4 Z/ z8 D. Y1 }* E' |) {0 a
                perror("open error");! w# M( |5 Z6 m; q8 W7 j
                return -1;
% w8 H5 E/ ^% G  H        }" K2 L# d! ]4 f9 ^
        2 A" r4 n1 y$ P' e
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ z& H5 z. R; {/ ^3 g* i/ s

3 @/ d9 z4 W, |1 f6 u8 @; w5 f        while(1)
% ~. t3 G* s) W) M! _7 E" \/ d7 i        {
2 [# o9 ^  C- N$ F& }2 D: q                read_MSG_buffer(mem);
. G% {+ e" h- z$ N; @3 d0 d( Z* C        }               
% P# R: C7 P2 p: j9 X}6 m& @  a# p+ u" D
& n! a7 T* k/ H6 Z
void read_MSG_buffer(int *baseaddr): B9 P2 T% B' C* ?& U
{3 ^- ~) |& Q- F" Y
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ }! G. B$ n, i7 q  g1 u3 F, W
5 @/ R/ C2 \9 R  ?5 d1 K- m; V( ^
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ l( N4 d; B; V- l
" H5 w# o3 Q3 t6 _. Q! y* G" A( {        if(pshreRAM->packet_cout != count_copy)
" D0 |( e; Q$ g: c, M# J4 Q        {# h9 w5 ?1 `0 w8 o  T: f* l; o6 q
                printf("a is %d\n", pshreRAM->a);( R6 E4 \: b6 `/ F: c
                printf("b is %d\n", pshreRAM->b);
& f3 x% Z3 L7 K) K2 i                printf("count is %d\n", pshreRAM->packet_cout);
  |( `! t4 C6 T                count_copy = pshreRAM->packet_cout;
7 Q- x1 V3 C" i* \        }
! \- \% Q4 |% C. n" j2 T        else
: p; r; T. S8 u) d- a! ^        {
/ n+ ~2 B- b9 h: n9 f; |- H                printf("No effective message!\n");
/ u# W- t$ Z" p! ^2 X% b$ |        }
( _$ z) n: L0 A( X6 r}% K* ^! g8 b0 L% Z

8 Y# q1 Y3 |3 l# B+ _没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. I* A6 q$ p4 \6 k
- ^0 H( i2 Y' o* R5 A) s- x

1 c! k0 @/ c, s
: U2 [- Z* i" Y8 P% G) d
5 y5 a1 r# \5 j+ v0 [2 ?




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