嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# H/ G1 i6 K2 y. m+ \: S/ ^
0 S8 \0 }3 ^5 ^! }+ J# @* L. b, qOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 \' n5 G3 C4 g) i/ P
#include <unistd.h>
9 ^0 _# t) O7 `  \- H0 ]  I#include <sys/mman.h>
# s) J' q1 \" T, S#include <sys/types.h>
) s7 l  d' D- b  Y. X# f. t#include <fcntl.h>
9 m' l, q8 b* L4 Y$ G0 t2 k" r9 i6 ~- J+ |8 {1 w' y0 x
#define SHAER_RAM_BASE_ADDR    (0x80000000)   : m# t' e0 H  ^- I
9 b  _/ J: d2 c
typedef struct
6 a4 z9 h0 {9 R% _{/ ?' [; {0 y/ V) X" B6 {
        unsigned int a;
4 R. r  _; l% H        unsigned int b;; c' v, g' c# J" r  }, ^  z
        unsigned int packet_cout;
0 K! }9 ?8 [* q4 [- j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ N% \: Q1 J7 d4 u- A5 Y' M# x
0 r/ `5 U7 N' B& q; A  O% W! B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);$ b# z" ~1 `# X6 b0 F' e# N
unsigned int count_copy = 0;6 p. r! @) ~2 H
9 [) |3 I1 }+ f6 y# i2 K
0 n, F% d9 k- Y+ V! I) V" ?8 V
int main()! F7 ~+ S- J* q8 s' _8 J3 _4 X
{( ]7 [% p7 F+ \* X
        pRX_MSG_PROTOCOL pshreRAM = NULL;: g- H. C+ H5 s8 r% G  c
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ P: a8 X: B; \3 Q

4 I! S' Q$ w- b        while(1)
$ D7 O* ?3 W' x5 M: W$ t% X        {- x" ~  P  U) q9 r
                read_MSG_buffer(pshreRAM);  X/ Y2 B2 g8 S
        }                * v- L3 H  h5 q% t* v  c# t
}
* ?+ r0 i: X, {& w3 t. n6 x
' O  k% P- P2 O; kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' M; O8 I2 s7 I% R
{
' _' t. t5 k. A$ S9 \. [        RX_MSG_PROTOCOL buf;
( i7 h' ?1 }* O; t        
$ n0 s1 U* ~& }$ _        buf.a = pshreRAM->a;
: t6 O) p& m8 i% a+ F        buf.b = pshreRAM->b;! o" l8 D; E' ^+ `# M
        buf.packet_cout = pshreRAM->packet_cout;
* v7 O9 B9 [1 O$ h        % A1 b7 c# p2 a  l; M$ f2 p
        if(buf.packet_cout != count_copy)
' E7 O. G$ Y) ]) v* Q4 B# r# w        {
. c$ x' ?% L) r9 E  L( q8 _                printf("a is %d\n", buf.a);7 [. o0 S# O! i
                printf("b is %d\n", buf.b);& |" y' v3 G- ?  a2 A
                printf("count is %d\n", buf.packet_cout);
2 D7 t4 w) ~3 t3 D0 d/ S                count_copy = buf.packet_cout;
6 S3 v. v( U+ G. N6 Z0 l        }2 W' k. T& c5 T  c, W: W
        else
/ V* M) A4 F' `# r: ?& b$ z8 Z        {# B) b, D/ b  f4 @7 y& k- t9 s
                printf("No effective message!");
& p% [% x# O9 \8 v! b        }
- G$ m  t# _. T2 n}
! x: ?  J4 M; n' {
$ A5 ^3 P- G5 n  y; {* }
( W+ M. W6 U" m4 F1 r但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ r" F+ q# ~4 Y& f' b5 n使用下面代码,对内存使用了mmap函数后:
- k/ s* Z9 _! E6 e9 h#include <stdio.h>
) l7 _/ o# [8 u5 f7 U#include <unistd.h>
1 C/ J* u# S* ^1 X# n8 w#include <sys/mman.h>  V6 e# F- Y! d# w5 i% y! y
#include <sys/types.h>
* r3 g+ ^1 C9 [  B% R1 I# Z* N0 R#include <fcntl.h>) |9 ]5 a1 N7 ^% q, J

- j3 F4 w" z5 t7 [#define SHAER_RAM_BASE_ADDR    (0x80000000), R  d. G# \3 l9 e( Q) j9 O- W
#define SHAER_RAM_SIZE         (0x20000)   . G$ Q! e' A, U
8 G1 Q: D9 w$ n& H0 U8 d
typedef struct! i3 d8 P5 Z" j& x
{5 d5 y9 J' n! V8 q/ K: r7 R% A# S
        unsigned int a;
$ l$ U; v- O; ]; b% Y7 [0 k        unsigned int b;% U2 s& n8 F& c$ Q
        unsigned int packet_cout;
/ V; B# `. y  K/ t% Z+ }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, ?' D' Y( |6 P' \& Z: ?6 |" l6 P% Z6 A. B, w  W% ?$ V/ d
void read_MSG_buffer(int *baseaddr);
; h- U/ e1 E4 D9 ^unsigned int count_copy = 0;, i3 S. s& J5 |+ ^
, J* k" S/ G* r0 l, s  G
int main()' w+ K+ \, M2 ^* t( }5 H* {3 w/ L  a
{
- I6 \' {! _; b; ~; W  a        int fd;
* I9 h& g5 x" j: r+ m        int *mem = NULL;
7 L8 K! g, |  Z. f6 o
& A& g# I: I& |9 o  G        if((fd = open("/dev/mem", O_RDWR)) <0)
! t* a  ?: W5 b( k        {1 \1 ]; ^, v/ [  I
                perror("open error");+ y1 g4 H. i& p1 t2 B! O4 M4 o8 I
                return -1;
: d; L" ~# v, V4 q2 F        }
% \& d- B6 ]; p( B, u/ `        
( h# Z9 T; J( d( M        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! z! j0 t/ ?5 G, Z( h& E  l- H6 y: I: a) f
        while(1)# k" d+ i7 Y8 }3 e
        {
# O5 [1 x8 _( @0 K9 C* P                read_MSG_buffer(mem);
) \4 S1 b+ M1 u( f        }                4 i+ Z) n2 B5 {4 {2 \" r1 n/ ^
}
; ?  z; o) x: ~) [$ `: a/ R0 S8 e1 m6 T9 `2 `
void read_MSG_buffer(int *baseaddr)+ Y6 @0 R+ _3 i& ]
{! k! E  j5 u$ x' v! e( b' P
        pRX_MSG_PROTOCOL pshreRAM = NULL;" k6 R' O* {/ g  s$ p) ]7 f
: J4 Q( C: t. g6 l: R
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 \! [& S  S) Y# {: G0 y) N
) B2 G0 m8 O) C# e        if(pshreRAM->packet_cout != count_copy)! }: J6 M; D+ n5 J) Y
        {8 w( z; n. e; f7 b% u2 I. t
                printf("a is %d\n", pshreRAM->a);
# N6 A$ K+ p$ [" o* u' d                printf("b is %d\n", pshreRAM->b);3 R, A* P9 m; U* D* Z* j
                printf("count is %d\n", pshreRAM->packet_cout);  D; L8 [! k" \, ~5 b) V
                count_copy = pshreRAM->packet_cout;; Z% d) l6 v1 n" G
        }
2 l3 L1 W8 P9 L/ f' F+ B% A4 }1 P4 B/ l        else
  E+ Z; Y, n! L. Z! N2 o* T        {
1 ^1 P/ V- @9 W$ n( S  s5 y' Z, _                printf("No effective message!\n");
4 W, T+ ^* n( e+ j/ b+ e        }7 K2 `6 B% y, {
}! h. d& y; E8 Z2 O* r7 o8 ~
( O' ]3 ?- S2 Y* j' v
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 z' x( R( o" l. k# `: p9 C- a8 J" g2 y& G5 V

0 ]- d; }. A; y3 K. ]% T' S8 c7 `1 ^. y. W% s- n+ u* c0 D
  e5 ]( m6 L9 w





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