嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ C6 M- X: r$ _  k9 A% X5 Y) v$ o, e) r. D5 F
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 _( a/ r$ s: F7 L4 ^6 n#include <unistd.h>6 J% A. z3 }" U, F. q- \3 d
#include <sys/mman.h>
5 E" a8 I! W- I0 G) m#include <sys/types.h>" h) {/ t6 I1 K6 y9 v$ a. \
#include <fcntl.h>: E3 J' j0 w' Y! B8 }! }! F( J
. i7 [5 J- {1 d8 `
#define SHAER_RAM_BASE_ADDR    (0x80000000)   , o* b% q8 Q( ^2 k

' }4 a: [: X5 L( |( y9 atypedef struct4 C0 R- C- w+ A, l+ @# E) j, k$ x
{
4 h+ L- ]9 @: I$ P, D1 ]9 _1 ^        unsigned int a;
1 ~1 e; s; t2 S; c        unsigned int b;
, h! n6 {/ ]! A( Y( ]& o3 {2 q        unsigned int packet_cout;, K1 J" _. b0 h" b/ o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* p% V% X6 u% R) y6 i2 l2 Y' G& G9 q# x0 i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 ^! V* l  Q! |% K) k4 E: c
unsigned int count_copy = 0;$ b$ i7 G8 S3 D7 z+ Z3 q* V) K  n+ s

& G  u/ p0 U( }3 J$ a" G: ~7 S' Q: o& q1 {8 y: u9 O$ y% ^
int main()
; y. n/ f2 a* @' b6 K8 B{3 F( W0 W6 M4 d
        pRX_MSG_PROTOCOL pshreRAM = NULL;
% n- S& Q6 f$ j        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;7 S5 v/ D7 p+ S8 M
* L4 L: {3 K7 r3 B& _' Z
        while(1)
2 m) o( ?/ ?2 _        {8 R! Y. b- b+ Y
                read_MSG_buffer(pshreRAM);0 y! O$ ~' o+ f' |- P
        }                4 |' @1 J" A9 T8 c5 Q- D5 k. W4 G
}
, e7 Y6 \, H* ^- K+ S) `3 X1 k- V2 }2 ~+ [. h5 k2 Z/ ]) e2 t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( M. V+ ^- ]5 q" A1 ]
{
# ^9 s& a' @! D- B8 @# Y        RX_MSG_PROTOCOL buf;& J6 `& f+ d5 Q" Q8 O: r, }0 Y
          Y2 f0 r% J4 w
        buf.a = pshreRAM->a;: u, S4 `3 W; b8 s$ l; y- }
        buf.b = pshreRAM->b;% }9 s# `1 [' ~: t
        buf.packet_cout = pshreRAM->packet_cout;
, r, w5 u  z  V- a+ n& x        * g* H# |5 ?; ?6 K& {
        if(buf.packet_cout != count_copy)# W0 t/ \! L2 ]
        {4 O6 {+ s  C, p/ Z: Q+ l% e
                printf("a is %d\n", buf.a);
* `* y& a8 i5 d- H' l) a                printf("b is %d\n", buf.b);& P7 p9 O4 a5 |$ I) G5 ^
                printf("count is %d\n", buf.packet_cout);; R, y4 Z% o* H3 B- w. @
                count_copy = buf.packet_cout;
6 K8 _2 o& a4 F. s  G% J        }5 _$ L# J' q' a7 Y
        else8 \0 h/ {% B. j: _! f/ e' n
        {* v! B* v! {* `6 X
                printf("No effective message!");- v: I" L: h2 q# _5 f
        }
2 [/ v6 n  t# r4 D$ w6 U}
+ f! W% W, s0 h$ j; T& c: j& D# F8 J) ?9 P# t* l! @( w% s9 o- ?+ e
' @% d5 d( G# m; ^# K/ H( v2 P
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% p" w% Z. W: r& I" C5 A使用下面代码,对内存使用了mmap函数后:
9 E$ g% e8 O7 _#include <stdio.h>1 o7 B% i' [1 N- u. A4 }" w
#include <unistd.h>
, c7 F1 E, b' q#include <sys/mman.h>
- B* R% T7 E! Q& e! S#include <sys/types.h>
7 e) {# {6 }$ n, E& b#include <fcntl.h>
& }1 N/ ^' y- o& ^1 c% [1 \. ~# A/ B1 o
#define SHAER_RAM_BASE_ADDR    (0x80000000)
; M' k& z' a  D6 K  `8 W/ _4 Z#define SHAER_RAM_SIZE         (0x20000)   % B5 Y- Q+ G3 Z. w

7 P: G; F7 n  {5 _  U* S9 T7 ztypedef struct' m4 ?* n' L$ g5 p; a6 N4 w) [
{5 v& k# Z. [9 y6 e
        unsigned int a;
0 D! X" ^" j- F        unsigned int b;
- B9 a, y% i; U4 n        unsigned int packet_cout;
6 z9 M; U- J) ]3 M, B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ j4 \# I8 l4 a. M/ C* }
; [9 @$ i5 i( b% bvoid read_MSG_buffer(int *baseaddr);. C) ?9 L6 n4 P( R
unsigned int count_copy = 0;$ \# j6 S) ^5 _2 L( t

- z, e$ ~$ K5 \, b: f9 n& qint main()
5 j: T7 b" P5 T4 d{  N5 `) t' I2 _( Q$ {+ W8 Q' v. F) w
        int fd;2 c. t0 Q; d- c
        int *mem = NULL;
- O! r  s# D' z
2 d2 P& `/ O( D" Z: a7 Y* p        if((fd = open("/dev/mem", O_RDWR)) <0)
- x8 |; W/ [- ^        {" C# A1 q& Y( W
                perror("open error");9 F# d. I/ N" O" m  H9 f$ I
                return -1;
5 u. g* Y: V7 v; K* ]2 }5 J        }% Q. |! O7 I: H1 a0 D
        
/ F6 Q! B7 n/ T) X        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 S% T( h& b. [8 E1 z% C) K0 s$ F$ A1 }
/ I0 T' z7 p' X- G- O' `        while(1)( Z4 d0 G6 d6 F
        {
2 y" y0 @7 B0 D: @( X1 @                read_MSG_buffer(mem);
. H) i& g, v) {3 i0 n' z3 u( f) w        }               
2 S" r8 [! i: [}
8 A( H1 i7 m6 t: V; y! m8 Q. Z- H4 i# g) k6 V
void read_MSG_buffer(int *baseaddr)1 a1 |" J  a, W# l- n
{) ^- Q& j4 d# S2 ?5 T$ [* e/ L
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ F7 Q' p; ~+ B# {, S7 t$ ^
+ ?4 Z9 q& G- f0 G  F  Z0 d
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 e7 p& l! R% X: D% e& V; M' a
6 \; ~6 f8 C: T        if(pshreRAM->packet_cout != count_copy)
9 |9 D# s. d2 o# T        {  ^% n3 E$ t% b$ G. }+ [+ f
                printf("a is %d\n", pshreRAM->a);% O4 v! T3 g& b/ ^9 f7 ^3 X8 f
                printf("b is %d\n", pshreRAM->b);. P, S+ G; s/ D5 |* Y- G4 [
                printf("count is %d\n", pshreRAM->packet_cout);% J. @5 y8 j2 \  f! x
                count_copy = pshreRAM->packet_cout;
9 d+ S& ~" x8 s2 c- a; n        }
! u: i4 A  h. ~        else2 c, W1 o7 f% X6 b4 G
        {
+ R0 i2 _" c/ h0 X; |                printf("No effective message!\n");
, O0 e3 K* r5 o" C$ `8 p4 M$ Z        }: c4 d8 w" m2 z3 i& F% @+ D
}" I& m% O. I) w& `

3 \. \& H% Z: O0 H, p没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???2 L: p+ A1 H" G' S
* A/ p5 s( s7 }" X, u9 n- V" H

& q4 L8 t! f* m" B' Y% t, i" S# d+ j) D; U; e; B2 e* }
* E  Z; n( o  L" M, r





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