嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; v$ k% @* b# N: T6 {7 K- l; s' Q; _3 x/ W7 c3 J7 s
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ j2 F) C3 x! _+ c& ]* ~#include <unistd.h>
* r8 Q* G5 e1 N: T- X+ K; S#include <sys/mman.h>
' m9 }% A0 x2 L#include <sys/types.h>5 k' s' |7 B& _: F' J
#include <fcntl.h>9 v2 Z8 A5 o5 s- U
! s# G: D/ h7 j& o; M6 f
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
" a) {$ t3 D! i! O, ^& J: p* n+ H+ M5 P; V/ G- Y; f) O- q9 G
typedef struct
8 ~. H: o# I' {; A) V5 d7 M" ^) T{9 d6 z) U! E0 j7 U9 U2 ^
        unsigned int a;7 K& V6 S; j6 p
        unsigned int b;
" B6 m. j: m; f# {- W        unsigned int packet_cout;# x8 @# w. d" W% p! v2 @/ j7 }
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; C7 F5 N* C) r8 P! X- ~( g0 u3 m. V
: m) P& B5 n6 {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: Y6 {$ E9 w7 u" q/ kunsigned int count_copy = 0;* u9 E( f( x' @3 F9 B

! n3 v, T; \& k' z
2 S. a3 H8 m* e; }, rint main()7 h2 K8 R+ X+ }# e7 L% \( o
{
8 F# q' P, b& |# K/ s' F        pRX_MSG_PROTOCOL pshreRAM = NULL;$ E: [; V9 h, G# Z
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;6 {+ @/ T8 p1 N/ I! O# n

1 u: ?6 S, ~; ~/ k        while(1)
% y$ u/ X; }/ d) v        {% d+ S: h6 u% @2 C5 N8 R
                read_MSG_buffer(pshreRAM);: N1 z3 T- {  X- U
        }                6 V1 C* t6 H: j: m' ^( {, ^
}
0 Z/ o# f. G" a! l) I' i. G/ K. ^4 b) _# r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 r$ I9 @1 }8 M0 i+ \9 z8 s{* H6 [4 v+ }6 a( F* w" ~1 ]
        RX_MSG_PROTOCOL buf;
4 K2 m, q6 T- ^5 P2 Q7 S. X) h, T- J        
. i" J8 P% H# m/ D+ Q% [. B3 j        buf.a = pshreRAM->a;
" W9 `# u1 x% X+ F# t        buf.b = pshreRAM->b;- S  ^8 r7 l7 y, \& ]: J! K
        buf.packet_cout = pshreRAM->packet_cout;+ V; v: z! A! v; H
        * ?  i5 }' j' M1 t: c
        if(buf.packet_cout != count_copy)8 q8 l4 H' c/ @; c- @& I; B$ j% l
        {
- q3 I0 j6 F- i% u, W1 l                printf("a is %d\n", buf.a);
, G7 E- U/ D' n6 J8 }; @                printf("b is %d\n", buf.b);
3 z; t: a" P% U1 R* K$ T                printf("count is %d\n", buf.packet_cout);
; e4 a9 F3 `0 a                count_copy = buf.packet_cout;
( g0 Y1 P5 I' b$ O4 j: C        }2 M# K4 B5 s: b# `
        else
4 l4 d, N2 F" ~; O4 E6 T$ |        {/ j$ B3 G* `$ |( X
                printf("No effective message!");; z0 X( [( ^( V- c" T% z9 f
        }
: ?( F4 a. Z+ h( W8 i, {* m+ S& K4 M/ I}& o3 I# s6 P/ p4 R

* W8 \9 _" ~+ h8 j: J! d7 P4 X" i2 }: C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, h5 b7 _0 ]" P/ v- I1 a% ?* m- J
使用下面代码,对内存使用了mmap函数后:  e0 Z# [& @3 }$ u2 Y
#include <stdio.h>- E# y% b) C# W5 @
#include <unistd.h>- T9 p, Q, v0 C) l, |- X
#include <sys/mman.h>- P2 ]* T# S0 j+ `8 l
#include <sys/types.h>
) s$ C: D2 H, f3 q$ l3 Q+ o, [#include <fcntl.h>
! V2 T! z* _! o1 N6 x& A9 O
$ N, \. ~7 |; e6 e! V' m6 r#define SHAER_RAM_BASE_ADDR    (0x80000000)! A3 T$ {1 v! l, N% a. E, `
#define SHAER_RAM_SIZE         (0x20000)   9 _4 P" N8 O1 B2 x6 r2 S

& g6 i8 C' k5 t2 G5 Ztypedef struct' I$ R9 n, ?: V$ L# q; Z* K. l+ B
{
) r" [' D" }& I) E* W4 ~        unsigned int a;! j$ X* h8 p9 a8 `
        unsigned int b;# |4 A* I/ d$ F/ g9 Q" @/ Z
        unsigned int packet_cout;
, z" z' }2 x( t, V) v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) ]# y" H/ ^$ l+ X5 X2 r6 L
) W4 L- T! r4 e  X! ?void read_MSG_buffer(int *baseaddr);8 u- r, A2 a& \. x( u7 S! r
unsigned int count_copy = 0;' X" x9 d* P3 h/ A
5 L, k" ]4 b+ C6 x% |+ G
int main()
6 z0 {0 x' v; c) T8 @' W# s: i% k{% o9 `9 s* V2 c7 W% m7 ^: R9 \
        int fd;
+ c$ z. E' I: r6 l        int *mem = NULL;; X; M: b, w! V- p) A; x

) u; l- `8 ~/ t9 a4 M        if((fd = open("/dev/mem", O_RDWR)) <0)
, B. T- C9 y0 B9 ^9 p. ?& C        {
2 }9 x; O- O* L# J  h' P' x. t, \                perror("open error");
; f: }: \$ l: g# B7 |+ ~& O6 a                return -1;
' n/ J3 e6 R! q1 |        }* i  f8 ?0 n9 w1 T
        
1 P" X+ Y5 m! F        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 A' y+ u1 Z# \; A5 @4 x, r% i) ^- k# l) A1 a. C( f
        while(1)5 n7 Q5 d" ]2 L; f5 X4 D9 Q. u
        {
4 Q- f/ A0 l1 i# f! S1 s  w                read_MSG_buffer(mem);
- D# a) F4 J- y        }               
+ ~; F2 W! _  ?/ v}( E; \3 i* s2 b- A1 C0 c

: Y/ J! K  [; N+ y( w, y# gvoid read_MSG_buffer(int *baseaddr)  l- D9 V" ^2 \" U
{
. T4 C  ~5 G: ~" v        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 V1 j# R' i, Z' M7 T
: d7 ^4 \1 I$ \. q- u        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ s) h+ M+ A0 e- c1 U2 Q# |
7 }8 @1 M" N# {
        if(pshreRAM->packet_cout != count_copy)
- G- L% H4 ^2 _1 c6 L& j% u        {5 f* A& A4 F% ?# I. b4 G3 n
                printf("a is %d\n", pshreRAM->a);
6 g0 l) b# r, p2 |8 ]                printf("b is %d\n", pshreRAM->b);
9 M, j! J- e3 \- k/ L                printf("count is %d\n", pshreRAM->packet_cout);# h+ x1 i! m2 z6 p/ m+ K1 M0 U
                count_copy = pshreRAM->packet_cout;. S" ]" O* U$ @( b
        }3 g+ G' o0 M) b  h* A
        else
  q3 G- R- n) J6 @8 e  i4 e        {+ p$ w1 U7 A& Q1 ^- j$ E8 y
                printf("No effective message!\n");4 d1 J& W# ^3 M$ a9 P+ \
        }
9 k8 v5 X% N+ ?. O; U! X}. |# K9 J( _; G1 {
9 \- y7 {2 Q8 D4 Z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" s* o: x: X3 r9 R
; G1 i; Z# i3 v8 ^9 p) C6 o& D9 ]* e7 t; w) V8 P
- M$ Q9 k9 _+ A, ]+ V7 W3 N7 A

, u! ~/ ~; @  r8 e% O  V




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