嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) L! J. c0 G. C

( r0 |' D% M. g: e, _, @% rOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ W* r1 L6 @3 h" t8 ~: V5 |! R
#include <unistd.h>
8 u: {0 R" `, K" L#include <sys/mman.h>% u0 I& Q1 ~8 T' B
#include <sys/types.h>
1 Y$ M" ~9 ]3 @. k6 {* ?% A4 k8 d#include <fcntl.h>
8 n. R9 d/ h- N8 M' e& h
$ ^6 B7 r4 X8 p3 \#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) }/ C& C2 q" [' s: c) {# o

( f4 u" a9 a; H2 ktypedef struct
+ ]$ Z) u, y1 M& Q{
. w* W0 Y' J, `  N5 z) J+ f3 P" k7 }# n        unsigned int a;. u) I! J1 w3 L% V8 x, e+ c/ q
        unsigned int b;
8 ^! u9 I. g( S0 _        unsigned int packet_cout;
2 k3 h/ u1 e$ C0 S7 M  F2 }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. d; X7 M, Z% p* G: h  ]
& C7 w( c7 T2 F, ]# Fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 _" V1 G! x' R1 p8 J+ {unsigned int count_copy = 0;
% P3 B6 u  O1 H2 M3 b6 Q3 h) K" D- x6 g) {! w

1 K$ B' c9 o- Q7 ]( dint main()
, p3 ^# `0 N# ?" Y( P, c{. f1 \: G6 x6 Z" y5 d% @
        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ F8 U! I( Y7 N) F+ Q        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ n  i. c# W+ l3 t  R2 |+ G- {8 ^8 k1 C3 n9 i1 r3 z& V
        while(1)* @# ^/ o/ G3 D9 p
        {
6 I3 [( ^9 U- m. d; k) w9 H                read_MSG_buffer(pshreRAM);
- A& }; C' l% d) Y7 F0 m        }               
1 W, S3 b5 N* t0 w/ \}1 t( |5 k* V# G8 Y
8 v7 k. j5 e) d# E2 b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ Y9 p8 x  l, X' o{
" S0 H" u6 C: N; x1 z        RX_MSG_PROTOCOL buf;
  b/ J9 l7 s& d        
/ l  B7 G/ O1 ?        buf.a = pshreRAM->a;
1 p6 U6 s8 k' _* \( e        buf.b = pshreRAM->b;4 W6 V. w9 U* N" \$ N" h
        buf.packet_cout = pshreRAM->packet_cout;
  B7 `! _: y) W( e        
' S9 B8 u3 z" y: C        if(buf.packet_cout != count_copy)* \0 N- i  @8 F+ ]( Z
        {
$ E# X; h3 V) ]* B" q                printf("a is %d\n", buf.a);, B+ X" f* n6 a+ X1 J1 o# j
                printf("b is %d\n", buf.b);! ]; @: b# f5 \+ r# d
                printf("count is %d\n", buf.packet_cout);* z$ Q2 E) z; G% G0 H8 Z
                count_copy = buf.packet_cout;2 L( |- y8 o" m0 l0 F5 V
        }
( g  B$ B- Z4 w0 a! M* x/ E8 u        else
0 X& W* J2 Y" N. s2 D/ q7 f: [" P        {
; x; c4 o# R3 Y! ]                printf("No effective message!");
9 N4 g+ a. }9 v7 Q) {- Z% f        }
1 O9 G5 X* ?2 ~' u* S- I}
0 R. K8 o' B" P; \0 g
& k$ s; w( Z. e6 F1 A; \5 E/ W, C, {/ B/ Z) X% S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& ?+ S& c4 n  R5 p使用下面代码,对内存使用了mmap函数后:6 Y6 e* r: s' S7 t, V8 e; d- e
#include <stdio.h>
% J) t- A, G' U1 j#include <unistd.h>
7 J4 I3 J" P6 h* u+ V4 {1 W$ {#include <sys/mman.h>
8 a* @* e" x% D" T/ q#include <sys/types.h>0 @! h& K, l( t( A3 F* T
#include <fcntl.h>
+ O  B" M; @! I. E! h9 v' f5 ?5 h. R6 b% {, {
#define SHAER_RAM_BASE_ADDR    (0x80000000)$ m3 C7 d- V$ x! k
#define SHAER_RAM_SIZE         (0x20000)   
' b. M, {& v1 t9 [
5 E; i+ K' K& U- q+ {* G) ntypedef struct
; v: L  W& ~% I; ]9 d0 T+ R{
; X' r+ Y/ G6 O6 i( ?  W        unsigned int a;1 W! T* q; [5 @; {: Y+ E' V! W. E5 E
        unsigned int b;
! T7 ]$ Q3 l& b4 E, L# U# B9 }        unsigned int packet_cout;
/ p# m) O. n: W& D" T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 O* j5 ^0 X7 S+ `" H0 ]
6 U% f) H2 k/ T. \' M
void read_MSG_buffer(int *baseaddr);" W" d1 [" `. S8 L0 S
unsigned int count_copy = 0;% A, E1 i1 h* v! M  P% l, d
- }" E! s+ ^7 I2 L' P8 {! U
int main()
. o# q4 b( M1 s* S3 J7 N{3 }6 b* L+ y$ [( V5 ?4 H6 R
        int fd;+ H" o& P; b; U& B
        int *mem = NULL;
! v, e9 x1 M0 W& j( W! g+ e9 u% a$ n. z4 W: z3 c
        if((fd = open("/dev/mem", O_RDWR)) <0)8 p2 p$ `" c1 O( P" L, v- w
        {8 Q4 ]3 {) I7 k/ w" o3 k5 Z( y7 Z
                perror("open error");
; `5 z  g' M# m) D1 T+ _                return -1;5 O; |/ A* |- L* j+ |: F
        }
# l7 U9 Q  o- Z. b" U2 x* @1 l1 R        
# t' h/ `  h9 g        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ Z5 S9 \4 y) F1 [/ l! s; R1 z
8 T, w& k8 Y( r. e$ s  X        while(1)" h3 h% W5 _: ?4 @4 m4 d
        {4 a8 h0 ]$ n$ \
                read_MSG_buffer(mem);! r( {  E# O; N& J9 Q
        }               
) L* z' @' m6 {3 v' H}
# p9 S2 g5 K2 X2 a
' {8 W1 g* F, F# E8 V7 R$ }) Uvoid read_MSG_buffer(int *baseaddr)' m+ q5 ?& w3 I% N6 |0 r
{6 \7 N6 ?$ r2 Y8 Y) b* _% b9 f7 J
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ r2 F- ?) ?( S6 C

) D. u0 y& q% `        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( Z  h9 [, e( X! L0 P$ a! O6 f% k/ F8 x- a
        if(pshreRAM->packet_cout != count_copy)) A8 K/ q! J- B6 Y$ S+ N
        {
3 l+ N# Y" x& t/ w1 u                printf("a is %d\n", pshreRAM->a);- e' ?; a$ H2 d$ r. k2 Y$ L, |( A
                printf("b is %d\n", pshreRAM->b);
& O! E9 H9 M% m, {, D7 c                printf("count is %d\n", pshreRAM->packet_cout);
- M% ~0 L& ]( V                count_copy = pshreRAM->packet_cout;" u$ d& \0 f( o2 ?7 Y
        }/ a- W# M2 _9 S& T3 C
        else: H% l  ?; Z  o8 F* i: D6 ?( {
        {
7 @% k1 [; D  l. K9 T                printf("No effective message!\n");4 v) l# H" e. f4 M: ~
        }: R4 L  a! l- `( h: U9 ?/ I
}+ R$ O. A" u5 s
% w# X$ {4 S4 x+ j0 O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) T1 b/ X! y3 k* \. [( J- n4 C) E) _  M

. i2 R6 s; W) J; i& t& ^, |% w) H! S7 `+ [7 @: M. f( D" V

( ~% n2 j- k. A8 D; ^6 T" \6 j




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