嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 d# l* z  R6 Q  L/ ^  v. p  z
7 u6 `  b6 l8 B1 x+ k5 }: ?OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; m7 X$ G0 x5 B8 Y#include <unistd.h>1 {7 [1 z5 ]4 N8 O# p. g6 {5 A
#include <sys/mman.h>
8 O9 i0 m4 O! P/ m( F* M& Z6 i#include <sys/types.h>
" D/ e' g8 F7 q5 T( r& v#include <fcntl.h>
* o$ a- b* a% N$ \" {
" g4 f. E8 t6 F6 n+ U4 Z#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% X1 i: F7 j! y# X0 x. C0 o. z4 x9 B+ H. `: s, j% t8 ~
typedef struct
: R" t& u, J' `0 y2 |{
9 l" Y1 M# [% Q# O        unsigned int a;8 R  v5 a$ Z: D2 ~) U
        unsigned int b;: _+ l$ M# y8 f; t' e9 Q
        unsigned int packet_cout;
2 v% X) X9 r' O& ~. H( K1 K+ G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: b! [& r. `8 q" N
+ C$ Z$ s! {* @. u0 ^! F3 l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 m; U0 h2 y7 Iunsigned int count_copy = 0;" S; i" }6 B; j4 S5 Y5 w' I; a# i

, }/ @9 I: J9 R+ M9 c% n" F* {: B' Z$ S
int main()
* N! t' v8 T) |6 T" e{& C( S0 ?3 y7 u% m! z. c
        pRX_MSG_PROTOCOL pshreRAM = NULL;% D; t3 v+ I% K) _3 T+ {, c. |
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 I- a/ u4 ^5 i( H5 D8 c6 k1 N+ _# j) \' I5 {& G
        while(1)8 }% C* O, B2 c( L$ ~$ k: ]
        {
% R3 X9 w. M3 F                read_MSG_buffer(pshreRAM);6 K% C9 W1 U% c2 ?" M
        }                9 y( o+ F' A: |8 `0 L
}
: ^; w/ y9 d- {- N4 P$ \  w$ W$ U" L, r! X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 A2 f- I+ q8 l) U% W5 }3 z
{& y, `- I; X5 x
        RX_MSG_PROTOCOL buf;
. Z: K- t/ o( Z- K; H/ d        ' Y  `8 H5 F0 W2 l
        buf.a = pshreRAM->a;1 q6 a; f. @) c' P2 s$ R  u
        buf.b = pshreRAM->b;+ }) i" ^6 Q7 p" _3 ?# P7 S/ }
        buf.packet_cout = pshreRAM->packet_cout;4 Z; Z* X: K* N" O
        
# v& X3 c3 P% c5 g8 d8 Q        if(buf.packet_cout != count_copy)" Z" ^  X9 u$ ^% B
        {
0 ]& h. b4 Y3 y7 q                printf("a is %d\n", buf.a);
' B1 w( Z( y; ^  m0 G                printf("b is %d\n", buf.b);2 p0 n, i6 _: o' x) d4 N2 O4 [' ~5 z
                printf("count is %d\n", buf.packet_cout);2 y* B) `+ U( N. m: a
                count_copy = buf.packet_cout;4 W/ N$ x5 D" A& F, h
        }
# l" ~0 L7 {; ]2 F* E        else) J; L! k. X* V/ P% G" I
        {
1 z$ H! s+ Q4 x                printf("No effective message!");4 H6 [$ Z4 x, N; X, q, y1 v/ x1 d
        }
; h# A# u/ g/ v, j, Y' W}
& ^/ k- d9 D+ Z6 f  G
9 j8 N6 E$ h: B3 g
1 X! g( t2 H7 k+ ]  b( y% m) Y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ U. d- K+ d5 D+ U; i使用下面代码,对内存使用了mmap函数后:
3 U4 A6 u0 P8 H: q% }7 ?, ]#include <stdio.h>
9 c" C5 P$ `- F  t; G" w1 |#include <unistd.h>: B* {9 _, a! w" l3 b- B) [
#include <sys/mman.h>
* h+ ]+ y0 j5 b#include <sys/types.h>
; Y) k/ ?" x6 ?) S; S, j7 `9 n#include <fcntl.h>& L' y( q5 r& N+ m8 n4 X7 t
; r& _/ h: a7 s% t& \1 e+ h
#define SHAER_RAM_BASE_ADDR    (0x80000000); `6 a9 [  _  |. s0 ^, i3 j
#define SHAER_RAM_SIZE         (0x20000)   
8 B6 {4 ?" e8 w3 }6 T
; W7 m9 y1 a, z! O) otypedef struct
! F, [. |& H1 D& D* U; i{
& a; E" b! ^; P3 z3 U" d' r6 i& Y        unsigned int a;
1 c) u: m- l& ~( |        unsigned int b;
8 |7 c+ }6 h7 @8 a: K1 C$ ]        unsigned int packet_cout;+ v1 p/ d, B0 w8 [5 \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ Z" x1 O1 k6 @+ O* \5 I! U1 R8 G/ L8 q: g
void read_MSG_buffer(int *baseaddr);' b0 r7 ]1 G/ L+ d$ z4 T6 c
unsigned int count_copy = 0;+ V3 z8 k( u0 Q1 w
/ p+ l9 B. ?) c3 |8 _. d8 [
int main()
  R- L3 \0 M& G7 k7 T, ^{
+ O  r" n+ B, q1 H3 ?* l4 W        int fd;
5 C( R2 F' |: f) _4 G        int *mem = NULL;
( w7 ~! K: a) m) H4 B
& [# N# J, ^1 c        if((fd = open("/dev/mem", O_RDWR)) <0)
3 L7 R; @( c9 A        {. s8 G* B, i+ j) o8 ^! ?
                perror("open error");% w* b4 @: n& o6 K
                return -1;
! S' k) d6 d0 p% l% R. c        }# Y  B9 k+ {' |9 I6 a/ P
        
$ d9 |/ o5 V4 O' \0 N9 y3 T/ E- k        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* t' h" U3 |* ?

% l5 B+ p$ I  m! g        while(1)
9 d! L1 u: j2 C5 e/ ~& T        {" d" T. `4 @2 P  z: q& U  D
                read_MSG_buffer(mem);5 U6 w& F  g" J
        }               
0 w6 |: I+ p6 ]7 e- ?0 }}; ^% O7 e# j4 P2 f' K1 ]" W
! f' C' o2 E/ |$ }& a6 C
void read_MSG_buffer(int *baseaddr)  G9 m7 t0 E. Q- {1 r1 P
{
+ O' ?6 M) P+ Y% S' h- N        pRX_MSG_PROTOCOL pshreRAM = NULL;
. w$ b( l: [% ]1 p3 \7 Q
7 Y3 r3 ]9 `3 V- G5 I7 G/ ]        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 L& \" p( N; }2 [0 v; H- x
. ]& L0 T) Q8 \4 [/ y
        if(pshreRAM->packet_cout != count_copy)
. T, c+ l5 z; \1 y2 ~        {  {, w' Z' V# ~4 _( Y7 o- v
                printf("a is %d\n", pshreRAM->a);8 ^, w0 b! ~% Q) `9 g
                printf("b is %d\n", pshreRAM->b);& O# O5 F6 C" Y* v, }
                printf("count is %d\n", pshreRAM->packet_cout);" A% K+ _2 c" X% H& g2 N7 f5 E
                count_copy = pshreRAM->packet_cout;
5 ?0 r5 q& ]1 V: r1 n        }
4 l* u$ q; @7 k, `        else+ \; G0 m: R  G- K
        {
( q- K. y1 n: K, N$ \                printf("No effective message!\n");
5 T4 @+ N# z2 `+ X; \4 d        }) j% I5 N7 Z1 e8 v, m
}
4 S5 h# W5 h9 N) {$ S+ [; u1 z! p2 s6 g! O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 t( \% q2 `7 c$ H- R* w6 ^: G4 r
9 o3 V7 p9 O# P3 ]9 w

& m8 s( `! T3 a
) _4 [: r1 b# ~' s3 `




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