嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- \* b( Z; H+ A6 C, U. k: y2 @7 ^' I, ^, x0 N. c0 W, P
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 S  p# j2 ]/ x: Y9 r#include <unistd.h>; V9 E. N/ @9 h- _5 Q6 w
#include <sys/mman.h>- z6 u8 K* E  p9 j3 w$ s
#include <sys/types.h>6 Y, e+ t7 W1 p6 P9 p0 w4 @$ G" {
#include <fcntl.h># S" q0 q9 ], D: b. u' a, Q6 U
) Z, Z/ a5 R# ?/ R7 R2 C) ^$ A
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
/ K) _- ?- E% {2 J: J( B1 [- [0 X: E
! r9 _7 X8 \3 e' wtypedef struct; J* P7 E# K! r% `8 l
{
! Q0 c8 J" j. P6 a- N% g% e: W+ q) B        unsigned int a;. W  k9 a  ]% ]: \, _0 R; x
        unsigned int b;1 q; B+ ^" I. J  }
        unsigned int packet_cout;
- S$ D: e1 s, D) p% E}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 y, D" e6 q! B8 u6 n

/ b) J& |  H5 c% Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; T: X, c# O) h6 e. s2 j) h, l/ s
unsigned int count_copy = 0;4 O/ N/ T5 X' n' x& G8 x
, Z$ _1 \; T  B3 D; F/ |% |
5 m0 u/ O2 u1 A
int main()
; {* {8 H! g& @7 m3 V. L# U{9 ?5 X. ~+ R7 ?- O9 {
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# F, y9 F, y& Q+ x8 q& B+ {* T        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 N) p* z  m! Q. q6 g& _
) U8 s3 h) u, w+ R- T$ G        while(1)
" U/ V( {- Q1 x2 B1 W        {! N: }$ v7 H1 g
                read_MSG_buffer(pshreRAM);$ a2 V7 V  M- s+ w4 N
        }               
# P$ x& O( G" L6 z+ g7 k}
& a# ~$ c" q+ g: w0 f  O8 n+ Z+ c5 t! v% s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 O# ]5 G' m( s! b8 u/ {0 V
{
: v. |* [: e2 ~' B' x5 \4 B% h        RX_MSG_PROTOCOL buf;$ r- @* P( A8 A$ y. P
        
: w. a! i+ I6 k6 C2 G! ~6 X1 r+ F        buf.a = pshreRAM->a;
6 B4 |8 ^7 f' a- i' ?: `        buf.b = pshreRAM->b;5 R& j2 ]) t( h9 O, X, `; S  {
        buf.packet_cout = pshreRAM->packet_cout;
9 Q1 P' H' M# t& H  d        8 w6 R. k! d  g. Y
        if(buf.packet_cout != count_copy)
& X# K/ R# ]8 ]        {
7 }; ^+ R" _, n" b                printf("a is %d\n", buf.a);9 @* b5 b) c* q. K9 t
                printf("b is %d\n", buf.b);! P) D& C9 g( _& }2 [, [6 C
                printf("count is %d\n", buf.packet_cout);3 Z$ ^+ J+ N' C! `
                count_copy = buf.packet_cout;
; P5 Y+ Z9 ]1 F& R: {4 I        }
# }2 g$ a9 H1 w$ Y/ a1 `; x* }- v  Z        else
2 j# L6 Q& I* N% k8 a0 |0 s        {$ d) J0 W1 d( G
                printf("No effective message!");
0 }. R& ~2 x; x6 j- u" O& j! Y        }
" ~9 P8 i: }- A0 w}
) U& s) o, B' K6 }1 N5 Z
! |' ?! ?1 S3 ^: b6 u: n
( x5 |9 g; D+ w1 z) D$ n& b但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& G) {: F7 E$ A. `$ X使用下面代码,对内存使用了mmap函数后:2 V0 Q9 {2 E: w7 D# r
#include <stdio.h>
6 l0 A: k) _' \#include <unistd.h>. l; }- ~, J) v( }. v) S7 P
#include <sys/mman.h>
8 `) G4 r( ]7 Z0 u1 H/ P#include <sys/types.h>
6 L3 W/ d0 r: [, q# n3 M#include <fcntl.h>3 x* ^5 e$ K8 [# E9 q6 P8 f

5 V) `, {& i! I( R5 Q#define SHAER_RAM_BASE_ADDR    (0x80000000)# m- P& S" @" S( W1 Q4 U
#define SHAER_RAM_SIZE         (0x20000)   
3 u  L# g9 T8 L0 a. [) j
1 C) D8 X$ k- i5 y3 Ctypedef struct, \& g' s2 b# v0 J: g2 E+ Z
{- a( \7 |# E, h" O9 d% \
        unsigned int a;" k* L1 }; ?# K: H! c
        unsigned int b;
! p0 X+ t7 X' I2 J        unsigned int packet_cout;
; w& A! D9 `% L6 Q; K9 r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 x( @5 D* L  Z7 f" q- M* B
5 g9 t9 i5 Q) W% O, L3 I) S
void read_MSG_buffer(int *baseaddr);# j" I2 l% v2 k, D$ m
unsigned int count_copy = 0;
* ^+ C3 j7 o$ l$ Y  b2 p6 i7 Y( w& p/ P6 ^/ F8 G3 h/ H+ g
int main()
+ d  _+ }' x) j{6 H3 i! h: N8 G7 u6 S4 N# p& q
        int fd;4 j$ b7 a1 _5 K; p3 k4 U% d+ O& j
        int *mem = NULL;
  s# A: b9 i. ]. m# G
+ l  {0 N& V& y0 `, G( Y        if((fd = open("/dev/mem", O_RDWR)) <0)
4 T5 K  x, F% K/ o3 O1 l+ w        {
+ i. [0 t) A3 D5 l: I% J                perror("open error");
' H; \+ |# B" j. n                return -1;
+ _% K/ v2 ]* O+ y, a4 _        }$ b8 ?4 J& s7 u7 M. Z, k. G
        
* Z& e( P0 {9 U7 X; j, |        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! h# P3 r8 y2 o7 h/ B6 G

! H. Z2 ?, `9 o+ W0 @, Z+ ^+ q4 y        while(1)- H7 k5 ?/ x4 ^, x
        {" d# {  U( S- z, Z2 F: r, f, K
                read_MSG_buffer(mem);  ^' Z# L0 o* E7 f0 C
        }               
& f0 m+ j9 m3 {, d4 B2 K}2 o5 u" T9 C2 x( g

' I6 l, g0 _4 ]void read_MSG_buffer(int *baseaddr)' N% U5 H5 O. V& S/ x6 t2 n2 o
{
6 m0 X6 |2 y% h$ o3 t        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 ^4 D3 T8 R" ~: \! S9 q/ O' u5 y3 {  \
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' _- U+ D- K: \1 S* b. t

, S1 C% Y5 L. e* x/ D& D6 k, n        if(pshreRAM->packet_cout != count_copy)
8 o9 N" m6 M+ l1 L0 o! C3 e        {' S7 y$ G( ]  ^# g5 @3 Y" ^
                printf("a is %d\n", pshreRAM->a);* o: B& D; J: k6 h
                printf("b is %d\n", pshreRAM->b);" ]& k3 v* g8 y4 b8 g
                printf("count is %d\n", pshreRAM->packet_cout);8 ?5 i- ~4 [7 _
                count_copy = pshreRAM->packet_cout;
% S  _& E0 T# f# K# }        }
" E. o% b" e9 D2 ?        else
7 Y; I5 j8 E+ i2 R+ [  m5 T        {# _4 ?+ ?6 ^1 m3 C; K" n5 \
                printf("No effective message!\n");( c) M# j/ f( }6 s# S. g
        }6 [3 m6 L9 |  J  i# ]5 D# Q/ f; P
}
& M. z: a/ f! ^. v% u7 ?& @2 H
3 ?8 D  R# ^# a没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; t. f& z* h& C9 E; y6 h" m

) h+ e/ _, F# U/ a2 D: V5 U0 p5 x" d% m1 V
5 R' Y, \, K8 |1 i$ v
4 d7 Y  u) Y8 B1 V8 |# K  E





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