嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ z6 e4 m( u# H9 t  N' p9 v6 Z% }) Y5 F% q) I5 m! Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 X# @1 ~8 K. N' h( K) J
#include <unistd.h>; m6 g& y. q7 f2 q- W7 r
#include <sys/mman.h># `) N+ V" |8 r% B3 H
#include <sys/types.h>* i+ q# k: `: ~9 t$ A& Z
#include <fcntl.h>+ o% T$ x1 y" B0 v5 r: R

* s6 }/ u' b9 }6 P4 W; k#define SHAER_RAM_BASE_ADDR    (0x80000000)     ]; N6 B& K+ R1 A
& ~( i; E  }; B( D1 S
typedef struct
+ g5 r' _$ o+ [6 e* b{- x9 h% b$ e, X6 o% E7 m& J9 I
        unsigned int a;
; Y  a& ~) h& ]" o        unsigned int b;
4 v. ~1 v: d' _2 W        unsigned int packet_cout;
- K& D+ K: U- p) z& O1 _6 N}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 S: y" r' [! `2 b" P. l
/ r' l! D/ r% U0 t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 X0 B8 r% Y3 ^$ ]4 [5 W/ ]unsigned int count_copy = 0;! }. f+ \7 N# m) ?8 P6 K- E# v

3 L7 ~) Y. U, {/ v1 F
: p; D4 S3 S+ N. e# Yint main()( }! Z9 F5 }; B
{
' M8 v& x  @4 X+ E/ P) V# R        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 E. S: ?- u7 J1 [# u, K- b* ~% L6 `        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% Q: z" X$ z6 x- V1 E# R3 `
6 g  Z4 C9 a' a1 J9 b
        while(1)
$ G4 I0 I. p4 u2 {% b3 T- A        {: y7 I* y5 e4 W; B5 M3 m
                read_MSG_buffer(pshreRAM);
8 ?' Z1 f/ j1 }* Z        }               
9 H. N& ~0 ?8 E" B  `0 d}# ]2 R; r; h) O; I4 H

5 J  w& M  o6 gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* T+ j% b8 I2 v! j3 V4 k5 `
{; ~. q4 Z/ D& R9 O
        RX_MSG_PROTOCOL buf;% q4 I) G6 t1 J/ {3 p& q/ C
        
/ {( x, K+ ^3 \1 V4 j2 b( E  P5 }+ X        buf.a = pshreRAM->a;
% M6 E8 H7 f0 t. Z$ d: g        buf.b = pshreRAM->b;
3 h6 ], H! [6 W0 h* p        buf.packet_cout = pshreRAM->packet_cout;9 _. U4 |" H) q% x0 ^+ X0 ~
        + c: ^; i) }( c
        if(buf.packet_cout != count_copy)
  f# Y* S2 ~: r6 r) I8 h: n  L        {8 V. e' s1 ~, @' T" r4 D: P
                printf("a is %d\n", buf.a);# r# a6 \! h  l: d' C0 U. R% @, C3 V
                printf("b is %d\n", buf.b);( |9 I% O  Y6 w# M+ r
                printf("count is %d\n", buf.packet_cout);6 `! a/ i! J9 Z3 m% m/ l$ [
                count_copy = buf.packet_cout;6 T3 p$ P% v! J8 D4 `
        }, q# m4 `& k2 R; q9 _) L
        else
- ]/ d6 {( s  [9 o# k; g( O+ u        {0 \8 J2 I6 W; b1 G  x# ^
                printf("No effective message!");1 F. H+ r' A& [' l
        }  e+ |& n/ k* n+ T; |2 }  }
}
) M& |! q0 R1 _# f5 Q
; Y- }- B, q  Q/ g1 c: \) M! B/ r- e; l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ J, M& ~$ R+ Z使用下面代码,对内存使用了mmap函数后:
6 p! q5 h' W, `#include <stdio.h># N9 t0 U& d7 g, Z2 ^( c+ y
#include <unistd.h>9 ^2 X0 |7 o* T* C
#include <sys/mman.h>7 c. @' z' V: u
#include <sys/types.h>& Z; r& F( P3 [
#include <fcntl.h>
' k' s. V8 C9 U3 P# Q8 l
+ g7 @$ \0 ?  B" a0 Z( x, [' t# k#define SHAER_RAM_BASE_ADDR    (0x80000000)
0 O% b7 |: o; H3 E#define SHAER_RAM_SIZE         (0x20000)   
( M* g4 E# ]# @# O# s, u' F8 u) P  F. k! D6 ?7 a
typedef struct
' p; E6 ^3 [0 c! {8 U, t{- b6 @- u( A' J4 Z8 U4 j" Q& s
        unsigned int a;5 R2 u3 X  w8 J2 m( l( N
        unsigned int b;
8 z+ g; R% l, e% O        unsigned int packet_cout;: g) X% f; g( W% ~) r, m! a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  T5 e7 T, L% t& b
  t8 K# p: ~* f: ~+ e- g1 [
void read_MSG_buffer(int *baseaddr);
! z9 i# J: E) E6 T4 k6 S8 S/ Qunsigned int count_copy = 0;- K+ N% l/ N3 {' `; K
9 Z; H7 H' I: s5 c* @6 {* s5 y
int main()
  f$ m6 Y) d* `9 t, |& W" x{
& y4 T- d. o* y, c        int fd;
" ]' |$ W8 I4 {, k        int *mem = NULL;9 G) q/ X4 o+ k5 t8 f% `

; k3 \+ j! O, g7 L( \        if((fd = open("/dev/mem", O_RDWR)) <0)0 y% A% S. p1 g" @
        {
( r  T) i' {( B9 M8 m. H: X0 I                perror("open error");
# }: n4 u1 ~5 P! k0 a" z, r                return -1;1 u! Q; Z2 \& i' z. F* @4 i( ^, y: i2 o
        }, D+ K# c; s: [( V0 K5 M
        ) O: R% v4 v# T1 A8 n
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. Z7 K: W, H1 N2 G8 H9 i: T; ~
! n* t. z0 P1 i6 n3 _
        while(1)( i9 R6 u# C: s. G
        {
% R. s, U4 r4 T' {' S/ F( j                read_MSG_buffer(mem);
8 u4 {  S7 g0 F9 L- s        }               
9 x! ^' ]0 E, K& I' f. b}
# s! r8 X6 U- h6 S; M( w( i/ j4 }6 M& R4 p- t
void read_MSG_buffer(int *baseaddr)9 C" N0 v0 Q: f# s( M
{$ F7 J' A6 g4 G% Y
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: q% g  e% r% V$ ^* @
. F. s9 o6 |  D3 ]! `        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, E9 D: O: i9 q& I- w" v; |
( e+ j6 W  I8 I( u! n9 q9 I
        if(pshreRAM->packet_cout != count_copy)
' z, G; ]  W% X2 u# r, a        {3 k2 p" Z3 C0 F( W% L. }3 q. o" [/ t
                printf("a is %d\n", pshreRAM->a);
! g4 u  s/ Q; K% h- T+ }# R                printf("b is %d\n", pshreRAM->b);
/ U$ i6 D% M- [0 Z" b, ]3 ^                printf("count is %d\n", pshreRAM->packet_cout);
# q# X  O% W4 T. ]                count_copy = pshreRAM->packet_cout;
. q% O5 ]# g# {" m" y! ~        }0 U7 y  Z4 T9 m+ T3 G
        else
' ]) }  u; d7 M  _) S! M        {
2 @# O7 u2 y8 \0 [- S                printf("No effective message!\n");2 _8 t1 C. m+ O6 X: @/ q3 V, D
        }
7 d! c  s3 R& q- J4 c  j2 R}
7 v& H2 ~" E* z$ V- U8 b" `' t% q' A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ E* a- W* t& a/ G) p6 A: y
4 n8 }$ u: }; w* ~

' ?! Y" \3 @) |/ S
4 _* {% V) g( N& s7 \3 a- B9 b: k- }/ p, Q





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