嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 \, y; r- T: X6 d' }) f9 B
1 a9 _1 S' r% T  O; \
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; j! u) `5 v2 O2 X
#include <unistd.h>6 q/ m4 B3 j1 `: W7 h2 [
#include <sys/mman.h>  |0 h# J: `% W$ J/ T2 v2 l9 `
#include <sys/types.h>- H5 M) e3 U3 e1 E
#include <fcntl.h>. [/ j5 e1 O& F( F- d& D
3 P! f+ R( u' ~( L) w4 B4 O
#define SHAER_RAM_BASE_ADDR    (0x80000000)   : E, y5 a) a1 _' |
; N: O$ J; S( C( i0 {% G4 x
typedef struct& A  x$ |  o% |6 L# M
{
% k0 j3 L! K0 e9 B        unsigned int a;
1 y8 E' H1 N# F5 g' ^* G        unsigned int b;( d) t9 G* G' C2 }8 h$ E  X
        unsigned int packet_cout;
1 x% v+ z0 N+ j: [}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 a( ]7 J0 b% h
4 s3 u' u: r: ], \+ d$ F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 B+ v3 @* t% Dunsigned int count_copy = 0;
+ b* [1 {* }, p- l: c: T( i
' g6 C$ ~8 X3 z8 o8 I  E' A5 k  U% w8 F% I6 \7 g# s& n
int main()) k1 I! k- a5 }! Z8 H% q4 A. t# @
{
( B+ r  k# \9 ^) v        pRX_MSG_PROTOCOL pshreRAM = NULL;
& X1 q% G/ ^. L" S1 e' \        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ I- W3 S2 O' w7 ?8 o
: j2 J/ `# R, R        while(1)
9 ~4 ?. R% a( r& n        {
! P& D( g! k! v/ V" [. @) K9 r( ^                read_MSG_buffer(pshreRAM);' s1 u* h8 O# u3 d
        }                ! S* [8 S" X( P6 F. R. T
}
4 l+ Y+ [7 p( [5 [& T* A3 Z2 V. A' o0 D+ @# S- Y% V
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
  K0 J5 M" {) H4 k{
0 Y3 r4 z8 D" G& b" ^! Z+ _        RX_MSG_PROTOCOL buf;( i/ x- p! e% {: l" O
        ) `. w. ~3 a7 G* V
        buf.a = pshreRAM->a;
% a( H; M1 r0 {" \' _        buf.b = pshreRAM->b;. F. G# ^6 M- a: n1 j& G# B
        buf.packet_cout = pshreRAM->packet_cout;: m# A% ~* F3 I, D* R+ a: H
        
* C/ x) c3 r, d2 L# k$ Z: d# T        if(buf.packet_cout != count_copy)
) K, E" T, c: @' [4 O7 V" F        {
. ?+ z% z- S! @$ q  D                printf("a is %d\n", buf.a);
4 c  X$ u7 _: e! P, _4 O% n                printf("b is %d\n", buf.b);
7 [3 Y. [- \1 n, ^) C                printf("count is %d\n", buf.packet_cout);
$ i2 \( d  [2 j& \                count_copy = buf.packet_cout;
5 d# v8 \- l  x1 @! O# g        }
* q, i9 W1 {) O4 o1 g  A; V5 H        else
3 C- d0 b8 v5 A; h+ @        {
7 N6 \8 f, o( p9 b; f                printf("No effective message!");/ A) ]( S* {2 @+ z! e2 H: I; \
        }
2 N% S: B. j* n* u7 W7 l2 r}
* f9 x" c) s: E* x- ?4 b  l& q9 `+ y  o; q3 j

. B& K, W; c9 t# k# O但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 e3 [& s5 r, u5 {' }! f
使用下面代码,对内存使用了mmap函数后:
  u& v8 m7 ~3 G0 ~5 T4 M% ^4 F$ K#include <stdio.h>0 H; _2 K5 e9 x' V/ C6 @
#include <unistd.h>
8 f) o" ?' N: P#include <sys/mman.h>8 w" L; _1 Y: S( t
#include <sys/types.h>, n- [) p3 t: m1 t' W
#include <fcntl.h>
% y$ B" i) K7 K! R. U6 @$ l+ h
* [+ O/ i& a# p#define SHAER_RAM_BASE_ADDR    (0x80000000)/ J0 s1 o& u% ^- a$ I
#define SHAER_RAM_SIZE         (0x20000)   / [& Z- ?& n7 `

+ D0 B) Z6 P& b1 l( ~1 o& \! [typedef struct
' R: T" O! `/ f7 |2 z{
7 B$ f. y" B; X7 L$ l, T        unsigned int a;5 r% f! Q1 T( Q  z# y
        unsigned int b;
# x% P+ j1 T0 [. u        unsigned int packet_cout;
/ c$ q9 L- F% b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 O- I( s0 a" g+ K
  c7 {& {, Y! u  e: V. m! c
void read_MSG_buffer(int *baseaddr);
$ K, M8 c4 i( c- N* h* l. o  k: lunsigned int count_copy = 0;
" l" ], G( I% I
3 {& j: k5 C  I9 r+ Mint main()
7 G; M) T* G& j5 P( P{9 x$ Q) c1 Y; r+ u8 M3 \# @
        int fd;. z9 M; j' W6 ~2 B+ @  [) [
        int *mem = NULL;$ b; p4 G6 U' |$ x: K9 r' i7 Z( J
* F/ B- x' o' H+ r; }2 P2 S
        if((fd = open("/dev/mem", O_RDWR)) <0)
: [- v2 V- z+ {% Z        {8 x6 t4 S& K0 |' Y( S! Y
                perror("open error");
: S) e/ c2 t+ \; c/ C/ Q                return -1;. m: J5 C2 V3 h1 K8 E/ U6 I9 R
        }
' d8 u4 i$ O  o' h6 p4 @" ~& A        * s" Q$ d: }; I; L2 V7 ]5 L2 j
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 J/ U% u) j0 _& V
6 y  I4 ]1 s! ^; n% s
        while(1)
1 {3 V) z/ ~2 D2 j5 F! q        {
' Z/ s' u  ]) ]6 n, K7 e                read_MSG_buffer(mem);2 b: H9 j5 {1 q: c
        }                5 r- `4 D* U5 J9 d" Y
}
4 d% P& {9 m4 X+ g! x
. {% M/ d% k4 R5 T1 H( t, \5 J- Xvoid read_MSG_buffer(int *baseaddr)
: I% O6 C1 D* d) S{
: D* {! |: ?6 w: \' E0 T$ H        pRX_MSG_PROTOCOL pshreRAM = NULL;0 \( U, ]; t( J$ x

, o' J. V8 V# e2 f% Z; W        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 I+ F7 n. ?5 U) J2 c
0 S4 ~1 g; V8 J/ N% u2 v- j
        if(pshreRAM->packet_cout != count_copy)
- k" N- S* e8 O$ Z        {6 h. c- ^, O5 d% l( y+ }
                printf("a is %d\n", pshreRAM->a);
+ x- D0 ?! E2 D' w1 e( w) d# N                printf("b is %d\n", pshreRAM->b);
4 a1 s; ]4 {) t                printf("count is %d\n", pshreRAM->packet_cout);
* I" c$ ]1 l6 G                count_copy = pshreRAM->packet_cout;7 F4 {" `0 ~* @9 e" ~! [
        }
/ F. o' f0 ]  b        else9 X( i: Q+ a' G8 Y) s7 F  n( U
        {! o- G8 Z( y1 ~9 K  @: [
                printf("No effective message!\n");3 x3 W% P& j0 ?/ v: T! o) t: v& c
        }- H8 e+ b1 D- _$ g8 O* V/ `5 E
}
% ?5 D- O0 p- v+ p0 \1 {
% C6 `7 Q+ D/ B% V. S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 J0 Z4 ]/ k5 _: K( F" w* j
1 ^) l- U) Z; C& v. F$ }" W: }/ P. g5 P- n+ W

$ @/ e2 Q  x5 ]2 w* S6 u+ x9 D
1 ~+ K: K, u+ M2 c




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