嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) h/ S  E4 E% z$ R

, O8 E# d- \" pOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>  _0 H, {# ^9 Q
#include <unistd.h>
0 r8 H3 d9 W' N. i) ^5 U' L#include <sys/mman.h>
( p1 Z' v# P, |! i#include <sys/types.h>
0 K) B, z. d2 |#include <fcntl.h>- R: b1 |* t; g$ I. N% a

1 a2 ~: @# r: K#define SHAER_RAM_BASE_ADDR    (0x80000000)   
5 `2 O! x5 Q( J- r! p% I) Q. i3 }  `  ?5 j& l. z
typedef struct4 |# s* u+ x1 ^  A
{
1 |- z! I# O8 e# N        unsigned int a;
  ?3 Z6 `# ?; ~3 Z        unsigned int b;
1 A! L; z) Z9 l+ Y" D. ~        unsigned int packet_cout;! j3 I9 R* U& _& e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ K/ I" D  i, C; k0 k

8 C3 v8 E# m4 s3 n0 L* t; L- \: E7 ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: h; h/ A9 y  Z% v6 |4 T1 h2 U. F1 Nunsigned int count_copy = 0;9 I1 R% u/ u: ~8 I  J; A( o

+ A  X& ^" w6 e. U( _
8 |, L( K1 t, p. Q4 L( yint main()
; J) v1 e! X2 o; L5 o. \{( J$ f& d9 J- p' v6 ?* s
        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 ~6 }# y+ u! [) f3 j5 D' E        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; n" `4 H4 B% Z* ]

: B2 }# {" b5 h! {* v2 [! ]# t" N& G        while(1)
8 c2 N* j- b9 ^/ q9 L        {7 d" Z& d. N6 Y. U2 L8 X+ F5 c8 {
                read_MSG_buffer(pshreRAM);
5 R7 f2 a8 Q8 `+ B- R2 Q( C' y' ]' y        }                1 ^7 J! H9 c- V8 S$ n' U
}
( {; r8 E2 M3 ?( Q6 e' f1 z+ `; i  T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- M0 \/ g8 W- |: Z4 I{9 ~* S# m! s$ S
        RX_MSG_PROTOCOL buf;, T! ^3 n4 t0 O
        8 S  `: W5 p. U* a
        buf.a = pshreRAM->a;% M7 j5 p3 p3 F5 T6 _: A
        buf.b = pshreRAM->b;. E' m2 e; f( o) t5 Z. N( \
        buf.packet_cout = pshreRAM->packet_cout;
! h8 l$ w% Q8 n" {$ T        . \0 r* l" A# f' d; L
        if(buf.packet_cout != count_copy)5 u/ j0 G0 F' O
        {3 v7 ?# P8 L1 _" T. X2 r' x
                printf("a is %d\n", buf.a);
' K( {+ ]4 z7 d  ]" @1 B$ I                printf("b is %d\n", buf.b);/ w5 p8 ]" U% ]" c' L) C
                printf("count is %d\n", buf.packet_cout);
: ~1 @4 Q0 ^3 M7 H7 ]% w; B1 [                count_copy = buf.packet_cout;
2 S$ H7 X- o3 A* Q- k8 V/ t( D+ n        }! L: v" \, _4 j1 |) `$ \
        else6 A) \# f: ~1 B1 @( C5 Z# u
        {: E2 S- e+ c% q8 H+ s
                printf("No effective message!");0 f- y  a! z6 G7 H
        }
* M" C+ ~& h% t. I. U/ a}! ~* e! P3 @1 o4 f# J% M" n2 |: T5 s
& [1 L4 V+ [5 f1 H
* r/ g, i4 a. \8 b; K6 M
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" k5 ~' X6 f/ Z' x' X
使用下面代码,对内存使用了mmap函数后:
% U  t& w4 P- m' D( f#include <stdio.h>
) C  w# Q% P/ D+ P#include <unistd.h>
4 K3 r9 P5 C- [' ~+ C: R; S- k1 r#include <sys/mman.h>+ p* D- d% R: O$ X$ U# ^
#include <sys/types.h>, C$ }* _8 y1 o4 M4 q5 X( j( X
#include <fcntl.h>9 {, }& k2 Y- [/ ^& ^; m. ?' Q

% z( b3 I8 W! m/ f& N/ q2 u#define SHAER_RAM_BASE_ADDR    (0x80000000)8 X; E( V+ O: b% T+ _9 m6 e4 ^
#define SHAER_RAM_SIZE         (0x20000)   ' [/ K% m) s' U8 G& D
! E' g# M7 y5 I% I7 k
typedef struct& ~# A: H# e0 g$ r! `" p' P
{
/ _0 h' N2 R/ w/ R9 u0 d0 m8 a  S        unsigned int a;
, e/ {; Z' M3 g, r6 U' l! |3 s        unsigned int b;- C! V/ ?2 T& o5 ]% S' ?2 Q
        unsigned int packet_cout;
7 _9 L, C$ t! S4 L- E9 w" y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ E6 U* t- ^' `
3 S" Z6 t+ ~. L" Ovoid read_MSG_buffer(int *baseaddr);
& d4 n2 S+ n- }unsigned int count_copy = 0;
! Y; z! ^6 ~( n- ~# @; P: I6 H3 e$ @0 @" _# P0 y, b
int main()0 [$ r7 n( g! c/ f
{& c+ g8 F. ?/ ~6 L
        int fd;6 z( D& i" O) K
        int *mem = NULL;/ b: T+ m) U, x6 n4 W  r$ i. C
3 O9 ?/ |( ^6 P
        if((fd = open("/dev/mem", O_RDWR)) <0)) A# @3 V8 U8 s; p- C! n- O7 J* j
        {
0 m6 g/ `! n1 Y0 |                perror("open error");
( ?+ y% b0 t/ [% t% s7 p                return -1;' `3 D" r+ n& F/ h9 q( _# v
        }
6 f% q; l' F; B  J        
( g" U7 J& a! n; D: |) Z" q4 C        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; Q8 r! F* B! U' p
+ c6 R: S4 j1 f! v# {
        while(1)3 K8 ]$ K, S+ r& {  W
        {
" v  Q6 m2 b) _8 R                read_MSG_buffer(mem);
" {# Y  q% n- `" E* a+ C; i        }                , B* b! r) v0 o: m
}
2 Z2 T: o- ~5 V+ O& s
1 E8 ^8 w& Q3 v) o" F" v, ~4 C3 G& ^void read_MSG_buffer(int *baseaddr)
' k( \+ ^+ z- J+ V2 W3 X& ?% R{" W' m% T; ~' z* I
        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 g+ k' Q/ Q: m
% }; Y$ \+ z7 O% C        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- R3 ~6 L" N) P9 B. W+ W6 z( T+ b* W. \* H: c  I
        if(pshreRAM->packet_cout != count_copy)" `# Y  O" u3 t1 u
        {/ A3 i6 S; M( b2 t/ \$ Q8 B  W6 ^
                printf("a is %d\n", pshreRAM->a);
" v5 A4 E0 D6 y! ?) V8 U+ {                printf("b is %d\n", pshreRAM->b);$ k. e" {% z$ U
                printf("count is %d\n", pshreRAM->packet_cout);
7 t6 e' P7 j, D; E                count_copy = pshreRAM->packet_cout;" ]- C. R6 e+ V( l6 m+ T
        }( F6 J- _. |) v9 L7 M. }  j
        else
+ f( q1 X' U  @7 f* J, E        {
+ l6 q/ l6 ]2 L. @! L                printf("No effective message!\n");
4 f! I! i( l% h# J        }  J' N' e4 y+ K" c
}, V, J% m1 j( E$ G

$ I  i- u0 L6 c: N没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 t9 w" J6 ~$ `9 T) i, S; t. Q7 i0 C- X+ g( H7 |' d" Q0 n
. ~9 H! {. O. I- h# {8 R
1 P8 ]. t4 |- S& m( o5 e8 K) P
# `  ~, J- M) s: W& D





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