嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 f8 t' [  P) l- O; b' R

$ v' Q) D, e2 _6 M( E& R. t( EOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
  k. j/ j' a/ J( j" T#include <unistd.h>
( I+ j4 e  L2 ?$ ?, M- y#include <sys/mman.h>
8 z" p% J5 P- T1 w& |#include <sys/types.h>! k. H5 a. {" q* C( |9 b
#include <fcntl.h>( m5 K8 d+ c/ k7 s3 F# T
+ N4 @" U1 Q: Q- h0 m% Y
#define SHAER_RAM_BASE_ADDR    (0x80000000)   % ^( W$ F4 o( Y2 Y) X

/ G7 @( n2 R  o1 dtypedef struct
4 h. ?2 J, g7 ^) Z& b{
8 T% `% j+ [2 e5 Z        unsigned int a;
+ M9 `: c/ U7 _        unsigned int b;
4 e: _: `4 T5 w3 Q* {; v* S7 T" e- E        unsigned int packet_cout;
. h5 ]9 }- F5 `( W& T8 _  {1 J}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ b8 ~/ T) x. G" C. g, @1 l4 ?* _4 t; A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 V$ z9 {: u% f* \
unsigned int count_copy = 0;2 w# D6 N# ]. I( R+ a6 t2 c
# R1 H* Q& w1 k; ~. h. O1 F% p
( i- K1 @' W* Q" r3 p3 h8 P2 z. Z
int main()
% z( p2 g6 O6 x- E: V2 o- J$ ]+ b{
/ N" T6 g: H! _& c; P        pRX_MSG_PROTOCOL pshreRAM = NULL;
) _9 U( y  ^6 D; S        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ F  f+ O) p* i8 v: }( @
/ N* t) T/ E% Q3 W        while(1)/ e% [4 Y) s. E; t& k/ s; V9 u( ~- m
        {5 J- `' g: X% N
                read_MSG_buffer(pshreRAM);
+ S- {* J2 ]6 j' D4 }+ x        }               
6 V7 K, Q% F& F3 V/ D}) |# M5 d, G" {5 }; G5 C

# [: [1 L. k7 v9 J9 {1 |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM). e' }& S- N4 O; ^, m/ v; e
{/ D) q' y* k( a
        RX_MSG_PROTOCOL buf;1 E# ^2 Q# E8 b) A# Z  i- a) |
        
5 e" T5 N( Y. }- J        buf.a = pshreRAM->a;0 Z3 l' d2 X8 Z) D% |- X3 k
        buf.b = pshreRAM->b;
% r- x+ C9 O' z3 O" H        buf.packet_cout = pshreRAM->packet_cout;- T$ ^0 x6 W4 X, j# m3 q+ f2 U
        5 M8 e$ I/ c0 k2 _
        if(buf.packet_cout != count_copy)% S8 J! ]( F1 E9 h6 r6 L" s
        {
4 D2 f! F* R7 E  B2 B; \) u( K- W                printf("a is %d\n", buf.a);1 O0 \3 a+ w! h2 Z7 H% J
                printf("b is %d\n", buf.b);
' r" J/ B) ?8 r" T* U3 k3 {                printf("count is %d\n", buf.packet_cout);% ?# f: t2 K! t3 M
                count_copy = buf.packet_cout;+ t' e6 b3 A% U" V, f
        }7 ]2 V8 ?+ E: H: `5 p
        else# e' _5 v  ]: [/ q  g: Q
        {
* Z( r& g- J2 Q" T4 z; u                printf("No effective message!");6 l* V* @5 K" W# D. \
        }
6 W) m3 ]$ z# J, q}
  ~5 p! f4 G( F2 i$ i; E9 l; c% {  c6 b9 h, i! Q

! X7 q0 A9 t+ I$ \  u- Y/ Q但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! ]  \/ x2 r  d2 u" _, E) F6 u使用下面代码,对内存使用了mmap函数后:
. \8 o% u5 T4 D7 `6 r#include <stdio.h>; P2 P4 _) n, G. G+ E* [
#include <unistd.h>+ R2 w& F8 [5 a+ a( I
#include <sys/mman.h>
8 X1 y5 X% R  u8 m; t#include <sys/types.h>
6 a( d3 A; ?4 l# ]" X' u5 z- J* A#include <fcntl.h>% C* N' K/ r5 _* B9 B
" ~8 @2 R; V. D$ Y, U( Y
#define SHAER_RAM_BASE_ADDR    (0x80000000), [4 i7 u2 M6 i
#define SHAER_RAM_SIZE         (0x20000)   * ^: L, ~6 O& E

9 G1 J& d+ D6 I+ p$ htypedef struct
- O  q- f: [7 C; C) G, _& e1 c: Z0 \{
8 }* U: I% }, H: i        unsigned int a;5 Q: t7 @2 D4 ~# Q7 I6 w1 e
        unsigned int b;
: J8 M3 V9 p( B1 T) J        unsigned int packet_cout;" F# T7 V' W0 _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% D1 ]# }( H* P: g/ E" @7 L/ O4 [; G# c' j* \
void read_MSG_buffer(int *baseaddr);
2 s: a0 d% X! xunsigned int count_copy = 0;; z# Z3 z5 Y2 W) a9 A4 W
1 L$ v: P8 O, o) [; t
int main()5 d2 x0 a6 H: U$ h$ w; c1 d1 v6 R
{3 p) B! L+ [% ^# X
        int fd;
( Q( F( G9 a" C        int *mem = NULL;  Q2 t5 h- V% ^  R. \9 A+ y4 `  z
( n; p* {3 Y- G# D* |0 {
        if((fd = open("/dev/mem", O_RDWR)) <0)
) x6 Z; {3 _; g2 M* ]( A) ?: S        {7 |! `; L# u2 A  f; x
                perror("open error");
# L2 l$ g; N4 X# P: i9 S                return -1;
* o) q; A0 q2 T* S6 g5 E, H7 p        }3 B) V& x- `8 j- o( `
        ) G4 k' E: {* _: W. V
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);; a; I8 C: r- u

4 V7 S7 a( o! n+ c% t        while(1)
! L: I( c( d7 W7 m5 w" M! @; T        {6 ]6 v0 I; h' M
                read_MSG_buffer(mem);
6 `' n0 k9 o' ]4 U7 ], w0 |9 g" T, _        }                ! G" S$ a: G* f' G, x5 ~: P
}
  j$ k, ]/ V7 a4 j+ b
, ?4 s) [; z2 Gvoid read_MSG_buffer(int *baseaddr)
0 Y5 y5 f% Q, t" }4 ]$ B{
) R& b% O6 P' ]4 z' q  o4 V        pRX_MSG_PROTOCOL pshreRAM = NULL;
  }9 @7 l# e$ {
* |1 Z8 S5 U/ M& c9 J        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& G0 E+ V" m- |1 `& _1 }: Z0 [7 t
" O( w. D0 f+ I1 E; W6 E6 i
        if(pshreRAM->packet_cout != count_copy)
: t1 ]- Q) P% D. l0 g% c# k+ F: r        {) }  L: T9 I6 U9 X8 e& }; n% `
                printf("a is %d\n", pshreRAM->a);3 A- p" H' \/ c, |
                printf("b is %d\n", pshreRAM->b);
* }$ B2 G5 R  q' h7 K                printf("count is %d\n", pshreRAM->packet_cout);+ q: W$ h& p/ E0 F9 r8 \2 \- l
                count_copy = pshreRAM->packet_cout;7 c4 S$ d) @$ ~! q# f% w1 D
        }
/ m/ J& o5 i1 c8 v0 @        else$ `5 d& ?3 _% @5 P! }9 o
        {
. I# F& \: j/ G; e$ _+ J9 K                printf("No effective message!\n");7 `# V6 x, \8 ?' Z$ g1 q/ V
        }
( P6 A) P" @& L) c}0 [  e5 n* m4 T& W; q" ]$ H# j

5 L9 O; W0 `( A; F( `& G没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' d1 E, i9 U4 B! F4 [9 p1 h* a' o
6 m! l8 o4 y. H( }5 l( ]/ {* j+ v$ A' M) T
1 v- u$ z8 [; I* c

8 B8 z+ ]  p+ Z! S9 N$ u0 K




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