嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # I. T, H" m1 ^8 }
! Z" N: i6 x* _2 b# J/ ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 j( c0 q9 f9 B2 H! r#include <unistd.h>
, N5 W0 i' A- w$ d#include <sys/mman.h>1 O/ [* X% h- F; T  j" E/ x
#include <sys/types.h>  M1 L* E' V" E+ }( g& u. K% P
#include <fcntl.h>
$ i. p1 s$ `7 |* [3 G
' j# p( L6 k2 b  r( t7 O#define SHAER_RAM_BASE_ADDR    (0x80000000)   
. A& u/ U, f2 _$ ^
) q/ E3 x6 F+ w* N8 P$ ^typedef struct9 _3 ?# ?; }3 z& X; y9 N) B
{% d; J( _. K' ~+ c$ h7 Y: E4 c
        unsigned int a;
1 O- w% n8 `; }9 n/ h) ~, ^        unsigned int b;; o, O4 \# k, l8 t
        unsigned int packet_cout;3 J# w% H* F/ ^4 V7 l4 s6 F* H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. b6 k& g4 n! w. q* D
) o. I: M: m1 Q; C% e" ^6 {# g2 s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) `$ I9 w6 v4 v9 F0 h% o9 h$ D" J3 kunsigned int count_copy = 0;
! l- d" L4 c2 a! a! L: V% M) V3 S- s3 W0 H5 w
4 H3 k# y) ]( C
int main()
2 a, J7 n! J( ~4 F! X) |{
5 E( e/ B$ ~' ?+ ~        pRX_MSG_PROTOCOL pshreRAM = NULL;' _. X: b0 j* f# [7 v
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ L9 x# |! I& n' Q$ T4 N, i4 R: ~5 c8 o4 I0 D' i
        while(1)/ j) D5 C6 g+ @) D* V% h1 X
        {2 _: i+ W+ ^0 E- J2 `% K
                read_MSG_buffer(pshreRAM);
8 x/ @, x( W9 q- i7 s        }               
6 G  `1 L9 t* k3 b0 t% ~9 a}
+ D" m6 c  k2 N0 D8 U9 @7 R3 ]3 @) e2 [  X3 y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; k7 Z# F5 n5 N{7 E2 u" L' q* f3 C
        RX_MSG_PROTOCOL buf;
6 r) m- C% H0 i# {        
2 y, B1 @5 E. Q! R2 s0 [1 v        buf.a = pshreRAM->a;1 r) u8 p- U0 k
        buf.b = pshreRAM->b;
4 d9 b+ D0 l7 v" r" X        buf.packet_cout = pshreRAM->packet_cout;( c5 G% E! W- Z1 L5 F( Y7 U
        
6 D. U- ]# t! P4 \5 {        if(buf.packet_cout != count_copy)9 m: T; L5 P+ V2 i% c; ]
        {
0 N2 j2 U) s0 |+ q/ U! {                printf("a is %d\n", buf.a);! q( d; h# r: R" U) A' S- a4 Z
                printf("b is %d\n", buf.b);
$ u; m8 w1 E8 Y3 W7 @6 f* |                printf("count is %d\n", buf.packet_cout);  G' g3 c( ]& w8 X
                count_copy = buf.packet_cout;  [' Z' C& s; `) S* {5 q
        }- U8 O. l: m8 B5 v3 F3 o+ u
        else
2 W: H9 S( S; `# \4 T& a        {
9 |+ O0 x8 t4 D, P                printf("No effective message!");# {* M0 ^2 J. B6 I" m1 O- ]
        }, c) x0 }$ Q0 `" z- D; g
}
, s  y) L2 K: d( x) y
+ Y/ }- `2 N5 ]) m/ G- o) r% r- u% ]( T9 ^: z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。7 V2 ^% S! U! p& Y
使用下面代码,对内存使用了mmap函数后:
& r) N7 P6 d$ n; V#include <stdio.h>
7 L1 O6 R( R  m# B. Y% w$ }. z#include <unistd.h>8 q6 j' C; g8 I( c1 j6 d
#include <sys/mman.h>6 _& L5 {5 I# u
#include <sys/types.h>
7 W3 w" H; w' Y2 B5 \# Y8 _#include <fcntl.h>1 u" C. r; l, L: c" U5 }

# z+ R) V$ y2 Z% |4 n2 j/ b#define SHAER_RAM_BASE_ADDR    (0x80000000)8 O+ k2 Z$ H: w/ q- h! U$ N; f" h: p
#define SHAER_RAM_SIZE         (0x20000)   
) v3 H/ u2 `# S# U; ~
% E) i: v7 F1 s5 ~/ C$ P9 _6 E: Vtypedef struct* s4 }' r1 @9 x- M
{5 F2 J  L5 w5 k7 U5 K
        unsigned int a;
9 ~- S) l5 [0 e1 ]0 W0 ~        unsigned int b;  r  w9 @( S+ o
        unsigned int packet_cout;
' d! V  w* H; a2 D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- m8 ]& _6 ]! S* B
+ j# Y# i: r: P6 fvoid read_MSG_buffer(int *baseaddr);% I1 U5 g7 ^  N4 `) a7 @+ s
unsigned int count_copy = 0;
# r3 i6 i1 v3 k1 H  J( k$ Q% F' C$ y, z3 B* ]0 m" P3 A- x
int main()0 f: P" l/ O( `, o
{
" l, l  X6 Q9 a" G6 r4 u        int fd;! x8 j  P+ x8 L; M1 J2 h
        int *mem = NULL;
" |$ \) b/ i4 w( I+ w( Z; S
% q$ Z! o# {9 G$ n4 u$ s6 A        if((fd = open("/dev/mem", O_RDWR)) <0). t# M" {% h  k& s, V
        {
4 h) o  ]& c3 d                perror("open error");# ^, q; G& Z* @6 B* G
                return -1;; u9 t2 I1 x% C! C9 y( b4 j1 }
        }/ ?" }5 D! t* C- P# _! i
        $ m% M3 b; J# s9 A5 D( U' [
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( E7 k: k1 Y; s1 A( P8 I, B! C( Y. C; s& }& X
        while(1)* H, k: y2 _# Q8 h6 F0 D) w
        {2 r, m: i* x6 B. _1 B3 r
                read_MSG_buffer(mem);# i8 S$ U% l: H
        }                / ~6 P1 l5 X" O/ L' J: j8 W9 |
}
, R3 v. ^1 e! V4 g3 `3 d6 L' I! f+ C* V  ]- S
void read_MSG_buffer(int *baseaddr)
) J) W: ^  v% {% x6 m- F1 n{
+ s  h/ @# d$ V4 Q        pRX_MSG_PROTOCOL pshreRAM = NULL;
! H( N5 W' S1 h2 t( _5 q; H; D2 @
6 b% H, h3 E1 t. n5 ^: @6 Z        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. g( k, S; t6 Z* O: e1 v0 o" m
2 ?" H4 s- b+ E4 I5 A( X% Y" w& y. W        if(pshreRAM->packet_cout != count_copy)
  Y+ J% b1 }( C2 @  K        {" w, V0 T" `) `7 y; ^* j
                printf("a is %d\n", pshreRAM->a);/ d8 w- M/ m, g  b; o3 w3 |& T
                printf("b is %d\n", pshreRAM->b);& X3 _1 s% {' b0 q2 F: y
                printf("count is %d\n", pshreRAM->packet_cout);' i' N) t2 f: g( S
                count_copy = pshreRAM->packet_cout;
% I7 B, S8 b9 s+ t; T% X1 X        }
: b! N1 n% D+ ]8 G$ `        else- C& q; U  L2 ^/ f. T- O7 t: F, Q
        {
+ @. f) p: A' Y" F% f! T                printf("No effective message!\n");
7 A* r* M$ t3 k" [. X        }
0 ^" g" h+ u" [( r% @' @}5 R5 c( e) ~" Q2 H) g- C; U9 N1 ~

  Z0 O" t  v5 J9 E( A* u9 \7 ]没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, ~/ U. D, n, `* I. t7 d0 E+ p

" A6 O! W1 x/ y  h9 L& X* O7 r. r5 J: z! K/ _" F) n
# H; T1 S! R- P) ]1 O9 [
- [" l7 x; F1 \$ H/ y8 h1 A





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