嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑   u$ e3 [) o( L9 F5 }

& G' A% A7 d4 O7 iOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ g' T+ P0 ^9 l/ `#include <unistd.h>
; w8 h# q( X+ q, e#include <sys/mman.h>) |1 k6 L; L$ t3 M
#include <sys/types.h>: e: C8 h* d5 c* _
#include <fcntl.h>9 l8 F  M6 v) }

! ~& u5 v. Z2 i3 l#define SHAER_RAM_BASE_ADDR    (0x80000000)   
; U( Q" B0 G( o0 _! {4 C
& c+ K3 \, `6 F3 H" `( Vtypedef struct
* R. d9 }/ H, M" Z: V4 U{1 V1 @% O, E  |( O- `/ w
        unsigned int a;: ]- @$ L* r. Z- q$ n
        unsigned int b;6 [, L0 I' D' x, j7 P
        unsigned int packet_cout;, R, }8 J2 E9 r7 }4 ?& @2 v6 S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 p+ Z8 K) T  a$ r2 p8 k# A$ j# q! t- B) w+ e0 \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# n8 I- F" s' G* {6 F) P& h4 junsigned int count_copy = 0;
) y0 O3 ]9 }% U4 A* _
" V+ T$ p" p! O& N% V
$ z5 G3 U5 o; `3 n( G4 r  lint main()! v& u2 F  J( X
{
* e) T, Y( {( B; r# d        pRX_MSG_PROTOCOL pshreRAM = NULL;3 _  ^$ j) S4 p9 |
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! z9 y& u4 a8 M6 x; j  J  P
# t' Z, T8 l8 [
        while(1)
8 d; K* g$ L( N+ a        {
6 N5 b; Y0 S1 }# Y/ r                read_MSG_buffer(pshreRAM);
( Z% r0 o$ s6 s# `/ ~+ m& `9 i        }               
% |) q3 D7 u% P1 G& Q( C5 l; ^: F! J/ y}, h9 Z! ~" d; w# t* x6 _* b

2 u: N6 k+ M. r' I6 lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, G; }! m5 F4 u7 Z" O{
3 i# x; U# H" d4 H6 Q0 J  X        RX_MSG_PROTOCOL buf;
& y3 c, H$ @# G3 K% `: h2 ]        
3 L% `6 ?  O! Z. N" X        buf.a = pshreRAM->a;
0 J4 I. `: V  l9 {$ {4 A  D        buf.b = pshreRAM->b;1 g+ i6 U9 r9 w
        buf.packet_cout = pshreRAM->packet_cout;0 x" B. z' {3 f  b
        4 S& @- B3 w' d) k
        if(buf.packet_cout != count_copy)- x5 X3 L( ?1 T$ A$ t. Q
        {
. @# L! a& ?3 o/ W0 w1 |                printf("a is %d\n", buf.a);
+ F! @& i% f) Q/ i* q+ [                printf("b is %d\n", buf.b);8 s: ~+ S9 Z$ B2 [5 t% j. b( Q7 S
                printf("count is %d\n", buf.packet_cout);$ Z/ s: o; g5 [2 x
                count_copy = buf.packet_cout;6 G4 K4 x3 m6 n' v5 A: k
        }
* |+ ]. p$ ?' A; U* _9 d/ ^7 m) c        else
( p. O9 l$ g3 M. a& d! L5 S        {
0 L0 r9 n# v0 q( r8 R! ~7 m: P( b                printf("No effective message!");
2 Q4 X( o/ o0 K3 C* C  O& q# X        }
& s! `1 X& ~8 k/ Y}) o5 P% K- T1 k0 R' c
$ o; l$ s# m- K; G

. }5 e: \6 D1 J' A' l但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ X$ `% p& k7 g# S- e  g& z$ J
使用下面代码,对内存使用了mmap函数后:
" S6 l, q% }5 y9 P" D$ l+ L#include <stdio.h>
' y, m. X* V& O#include <unistd.h>
- ^+ i% m: X- [& U#include <sys/mman.h>1 X* r! h3 ^, Y" k
#include <sys/types.h>
5 @. s. |, A1 S2 |#include <fcntl.h>
4 M# O/ \4 E; v1 j# r! v8 R
% Y, }/ o0 S9 }; E$ W& ^#define SHAER_RAM_BASE_ADDR    (0x80000000)# W* R; T, e) Q3 |% q$ b
#define SHAER_RAM_SIZE         (0x20000)   
& O5 K0 T7 _4 \- Q5 k
9 u( B" u" d% a& b; ~# m. C3 w5 dtypedef struct' |% Z* ~3 r, ]$ x  C7 ]5 ~# ?* `) X
{  [4 B1 S- C( Y6 ^# [2 ~8 d
        unsigned int a;
' ~) `* L8 u9 E2 N        unsigned int b;
6 y1 N  |( [( g; m' R        unsigned int packet_cout;3 h6 o$ O) z% C8 q9 t' ?  ^- F4 T" N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 B" j  F; a) a& d! ^$ W  ~
+ d8 N# U9 Q/ _6 J
void read_MSG_buffer(int *baseaddr);3 R; ~* Y: x3 l; V2 W
unsigned int count_copy = 0;! S# P. W6 O( l: w, u1 k& J

" G! X' E# h( I$ O' Lint main()) z8 w6 G+ M5 o4 [" I+ O, k
{+ f- E; _6 \- j2 g' l& Y
        int fd;
" X: h! f4 U) H# h' }        int *mem = NULL;
, G" ^" j4 w5 q' L' w- [: H! M" }: g
        if((fd = open("/dev/mem", O_RDWR)) <0)
+ y4 y) ^- u- q5 R6 C- X        {  O/ N  a! K. ^' `1 [! q9 l! J6 j
                perror("open error");
0 z$ Q. D& ^# X: z+ }                return -1;$ o5 S) P! O0 O3 _
        }. [+ X, G+ z9 A" a2 W# d
        ( w% R5 {# b+ _% ?6 b% o7 W) \
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 t1 |! x9 G: d* E0 I( F: o; g

8 h, n+ V4 _6 g+ Z- l        while(1)' G* T( h* p9 o0 J! P. }' G  y
        {3 e3 l; W5 X$ p! `2 j7 v. z
                read_MSG_buffer(mem);
2 Y* D7 w: b1 U' L" g( M4 j. ?& W        }               
, a# v+ Y% N4 F) @' v& ^}
; ]3 U6 ]0 o+ I8 h. [( Y& _% Q( k3 O# I' W- s4 ^) N: L2 ?9 @
void read_MSG_buffer(int *baseaddr)1 I: ^, X) f& d" C
{9 {" o! T' u( K
        pRX_MSG_PROTOCOL pshreRAM = NULL;5 d1 |4 }9 r$ q

- N0 q$ k+ ~, v* T/ [8 V0 z        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' Y* b) V" Z3 U; F3 q1 T% P7 G& _5 x' U% u9 [* A0 ]+ Z
        if(pshreRAM->packet_cout != count_copy)
  v! B: t1 }7 K5 X) T2 g# q' Z% T        {( C. V! f1 Z  ?5 G  _
                printf("a is %d\n", pshreRAM->a);7 m  C. i) s$ s/ [. Y
                printf("b is %d\n", pshreRAM->b);5 L. d4 e1 I  ^# Z! l  x  M
                printf("count is %d\n", pshreRAM->packet_cout);2 S0 ]3 V$ I0 o1 K& ?; P8 `
                count_copy = pshreRAM->packet_cout;: V2 e. q, b. z  _  q( p% @/ _4 m4 K
        }2 F$ k: t, Q; ]7 C( E
        else) R4 ^" k6 A: Q- n
        {
1 @6 e; _& s, `( x, J+ V# u                printf("No effective message!\n");
. a* D  U+ K( O5 O        }) r3 B4 L, P  {+ s7 C5 V
}
! j/ x8 R; @% x; R& s1 j; t- I, X8 W
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 h2 G8 P, m' Z( |1 P2 M9 L

/ l. q  ^1 k, T- a4 j/ G* j) g/ D- D+ `
( p/ ~/ I5 _' z' B- R

4 v3 i' c8 \( W! S4 J( |




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