嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" f9 q5 Z7 `9 N3 z, p6 R. `
5 l# ?" M) G9 a0 LOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 g) T) w% J2 I, u% E: p, `
#include <unistd.h>
- q* w5 x) F* r. Z4 l5 |# N#include <sys/mman.h>
7 N3 H5 {# x! L( l! s, @#include <sys/types.h>
; [) o0 V: q% _- f5 r; S9 A/ g#include <fcntl.h>
+ R7 v% J7 S; @, Z( k6 ~& N- j) h. t
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ! W+ h, ^& U- [9 X6 o

+ u: D% _8 K1 {* _2 B! Wtypedef struct3 s- e$ M$ g+ B+ I. {7 n$ P
{4 ?) S; H9 d' S  r7 ]5 Z
        unsigned int a;
! T5 \9 S3 Q: m        unsigned int b;: [! u1 b- b( X: G$ ~6 V/ W
        unsigned int packet_cout;
8 a9 l2 @% Q4 U( y. ~}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 P& o' W! Q" M) ~
/ E/ K* R3 J: u3 rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 |) R) n  _6 q
unsigned int count_copy = 0;9 l3 _2 [8 \. e7 ]8 f
! c. i9 Q* D# K
/ r4 D+ M, S4 S& M+ F7 H2 B
int main()
9 O- g- ?6 F* K. j{
* S! v- R- w# O- g        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 t  D4 I0 [, f/ a        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  t6 u# y5 Z8 y7 s4 m1 ~

& [; R; c8 t; Y% H9 \; w        while(1)' z! i8 ?  p/ J; G- O7 ~/ Q; C
        {
# v6 u( w& a; W3 H$ ?% P                read_MSG_buffer(pshreRAM);
+ y1 E; g! s0 {' X1 t# F$ q+ v        }               
. u- X- c; _# P* U) Z}5 C: A3 n( s* j! s

8 M3 W, {: j+ K9 H5 U0 [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( P# M# T! B+ `! g4 |& ~" l{' K0 r/ f; x" l& Y
        RX_MSG_PROTOCOL buf;
9 N9 X/ @% r6 N+ T. }* t% b* ]0 t3 u        : J6 P. u8 D1 j$ r/ o8 I3 Z
        buf.a = pshreRAM->a;
: ]+ V: \! }( |0 e" U. E0 j' I        buf.b = pshreRAM->b;
3 S" D; G3 T4 U        buf.packet_cout = pshreRAM->packet_cout;
4 q+ h) p0 o5 i  D( Z$ G        7 B' s5 b7 i0 V: X$ U7 w! m
        if(buf.packet_cout != count_copy)
0 |& Y$ ]; F# \  n        {; R: a. @: }8 r7 D
                printf("a is %d\n", buf.a);( H7 v4 X( a" e- V; J
                printf("b is %d\n", buf.b);
9 B0 W" }1 I/ O' a9 p  H                printf("count is %d\n", buf.packet_cout);
' C5 M8 y$ X/ T3 p7 R% Z% N                count_copy = buf.packet_cout;/ J% f7 Q+ s: F- j6 X
        }  N* a- D) R: H8 K
        else
# v$ W  ]; s' d& A# z        {
7 g& z8 F4 I5 @: v, U) {2 n8 B                printf("No effective message!");
: H9 y0 D0 O9 e, [" B        }
% G+ {0 E9 Q. I9 {, [0 y8 L}. M$ b& J: ?4 N( M1 Y. x

* D7 J" d/ o6 A8 S* _1 t5 \/ \3 C* W* x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 U! J' E3 T+ r8 ~5 `. o9 p2 N
使用下面代码,对内存使用了mmap函数后:
# C; C$ C7 ?# r0 |#include <stdio.h>
* g% b' N& x; D- [#include <unistd.h>
7 F6 @1 k& [$ P. F( P#include <sys/mman.h>
) W6 j3 U0 O6 G$ S" B/ {3 l#include <sys/types.h>
; e' E) h: ]& B& R" Z#include <fcntl.h>
7 U  N. ?$ X* R% ~( Z0 x8 Z
5 X  @4 K% b" d4 E  W1 x#define SHAER_RAM_BASE_ADDR    (0x80000000); d/ B0 L0 }! n% J( Q
#define SHAER_RAM_SIZE         (0x20000)   " X* Y/ H3 a& o

4 C& U: S- d' D% i9 ^7 i: vtypedef struct9 R8 w3 t6 b: Y4 e' F! `
{
2 _4 q- X  S1 f* }! _. T9 g        unsigned int a;( d& Q5 G; d5 ~- R( K7 V: a* C
        unsigned int b;! \; J4 S5 T- Y  ]- W
        unsigned int packet_cout;- w5 |# t) c  b$ c1 U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ W0 a. M6 z: |& j' B1 n& c
/ G( r/ I% S/ z5 O8 u7 L6 K! e6 e0 t
void read_MSG_buffer(int *baseaddr);
; R% h! j% v6 X$ B9 R& x0 ?" i% j0 ^# Punsigned int count_copy = 0;
1 [4 [& x2 S7 F2 x
2 n9 w# g# `* F+ V0 ~0 K) Lint main()- r, o( _9 U5 ]# l' b3 a
{. _2 G* H( D7 O7 ]+ r
        int fd;# Z& Z; r: y/ F" x9 `. J7 }' Y- A% P
        int *mem = NULL;' c7 i. q& z) M% S9 ]) E7 C

- E, d; `4 f: S  ^        if((fd = open("/dev/mem", O_RDWR)) <0)
, N: L, ~& g( g0 X4 M. P$ y, `        {
0 {5 J: s9 d( d2 i                perror("open error");
0 Z3 u3 _0 Z% y! U: l2 F! e) ^                return -1;
" q4 i9 x0 C3 i( A; v        }& H! y! s" m2 z' U
        
4 p1 Q4 D1 }  O  \2 ]        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- j% M3 [! [# `! h+ o+ e4 F/ {" P  V5 Q/ t) D
        while(1)
$ k, Q; s+ B( |8 a3 u( V        {. F; ]2 t! e/ a9 E# o' F0 i( s3 _7 c
                read_MSG_buffer(mem);# P. G3 B4 F/ s$ o3 a1 e
        }               
: P. `1 h" D3 |3 [) y}
. v1 S! x4 r. R- X* w9 p+ q4 a9 _& O
void read_MSG_buffer(int *baseaddr)
3 V+ a6 c' h! {$ y5 X{2 z( v; c2 I0 w$ f1 C
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 y  C* w! H4 r- ?+ `
+ V$ I, D- I5 C/ b5 D/ i6 u
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;  z# Z2 i/ ^) j: f
$ k( |5 Q0 o* E4 }  J  H$ x$ n
        if(pshreRAM->packet_cout != count_copy); a8 G" r( O0 G6 n/ k( |
        {
0 T. i) R! x# N                printf("a is %d\n", pshreRAM->a);
  @% N0 K( W3 V: B                printf("b is %d\n", pshreRAM->b);8 p' B! y6 b. s( ?7 J
                printf("count is %d\n", pshreRAM->packet_cout);
2 F; `* a/ u' Q; T( X2 q                count_copy = pshreRAM->packet_cout;
' S) Q" A1 H) {8 {5 m        }3 P# {2 B: s/ p2 _" N
        else( `! j4 E5 E) {' Z- w$ N
        {* X" Z$ z" z6 d+ y* k: ?
                printf("No effective message!\n");
' x: B9 [% Q4 W& t" A        }- X# ^# o* L. |% `
}
& K8 Q) e5 \& O/ b( X- [
6 L9 O9 H3 D0 u/ C/ F没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% ]3 N- E8 Q* C3 y' F4 V0 R$ T

" h5 x0 w9 `; ]& Y' M: f1 k$ |6 H& p6 M) ]1 Q. d/ m& i0 s
3 [$ R$ l  T$ P5 |  \" e

* C3 i4 M( ]+ L: O& @




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