嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 c" `0 W$ f! X: z( _) Y

4 Z$ q) i! C0 T1 COMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) }5 i% _& h2 G! F" R" B' M. N& `#include <unistd.h>
) n, ~+ R% \+ N- ^& `0 Q  t#include <sys/mman.h>
0 M- a$ b$ S" w+ C7 j#include <sys/types.h>" a+ U" i* y9 q
#include <fcntl.h>
  o6 Q* Y& M4 s6 `, w/ p- k, j4 j4 j# O' _$ @
#define SHAER_RAM_BASE_ADDR    (0x80000000)   4 Q6 ~1 Z. [  |8 J6 X

+ j: p! J; n% j& K$ a- {typedef struct
2 X# l% {  d! L' Z: B# q' v' L% z{6 ?/ W5 S5 v) M+ H! e7 m
        unsigned int a;7 r3 L3 S3 P% W% a  `6 Y: w
        unsigned int b;
! E4 P4 ^, B5 e) U+ j# @& S        unsigned int packet_cout;
( j5 D6 Z; ?- ^) Z; I}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ j- T$ C# ?7 U) ^! e

9 i& n: Q, m, Svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' a2 ^+ \; }) g3 ?, O' m' Nunsigned int count_copy = 0;
: z3 |$ J: d" }1 _% M9 f+ y( l" l/ U+ M# M3 t- |+ H/ u

( D3 X- u, |1 j. y+ Bint main()
& ~. r) k8 U2 P3 l  c7 J) [{* V5 ?1 o* l- U
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! F5 I# t% j6 h1 V0 x! U5 `" o        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ J' Z- N$ B1 x1 E

; L* ~# ~2 [9 d: C! K4 R        while(1)
3 ?" G* u/ h0 X6 Z/ S$ \4 E3 Z        {, o: F# x5 R& E
                read_MSG_buffer(pshreRAM);
7 [3 ^1 ?2 N6 e, Y+ n        }                + U( u4 i# I( U6 r
}
2 i8 Q& g' x; A. r
- e9 i  D4 W# L* ?! G  Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 @2 a8 X: ]* F{
! o' j* [2 p* R0 Z        RX_MSG_PROTOCOL buf;
  V6 ?1 W/ m% ^- J' S  A  ~4 b          R' K; i; o8 v4 |
        buf.a = pshreRAM->a;
5 s0 x1 i5 N# y        buf.b = pshreRAM->b;
: M) g; r+ ?& C1 j- P        buf.packet_cout = pshreRAM->packet_cout;
! @8 @2 x9 ^+ |7 x4 T! r# T        
# }) z1 O9 r! y2 e        if(buf.packet_cout != count_copy)
6 T3 E2 W) c7 o" V5 K6 b* c  e        {9 c6 F7 f7 k" ?& ^9 U. b
                printf("a is %d\n", buf.a);% q7 h- [, ^& L
                printf("b is %d\n", buf.b);% G+ B! c& ^0 W5 q  ?  S6 z+ s" ~/ E
                printf("count is %d\n", buf.packet_cout);: n3 b# }) U6 n! l
                count_copy = buf.packet_cout;
; L0 _1 g; m! e        }
; a4 o7 t" B# b% q1 H6 g        else9 \1 j. B( Q1 r7 {
        {( c1 S5 f7 H! ~: H) v1 G
                printf("No effective message!");* q! E7 m# T/ C
        }
9 \: Y2 q7 H6 Y' N) x4 @( Z}
  g$ o- x! t3 l
/ F$ w( r' s0 e
+ t( T) y, m/ q. Z. p# T: c! @但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 f" B, ^2 o( p) O
使用下面代码,对内存使用了mmap函数后:/ a: n, c: Z! R* z% M
#include <stdio.h>
( J/ E3 Q7 c" l; J. R+ H! q' `; K- c3 ?#include <unistd.h>2 t3 e% r5 y$ q9 k# l
#include <sys/mman.h>
: `9 w6 k6 K' P( V$ c5 Z#include <sys/types.h>/ m/ I4 X2 n6 o) Q' ~! [
#include <fcntl.h>7 o* g& U6 L2 M% K

% t. ]6 |' ]3 K#define SHAER_RAM_BASE_ADDR    (0x80000000): [2 N3 @" t: J1 I) A2 A
#define SHAER_RAM_SIZE         (0x20000)   ) k+ k5 x- n5 u

0 e* h9 Z: U$ V* @) x* q( |typedef struct" i4 C4 b5 [9 V8 |+ w* ?: W& z3 n- \0 J
{! l3 S$ h0 p$ y- Z
        unsigned int a;
6 r" h" D! l4 H% |0 r9 K; B9 d, [3 M        unsigned int b;2 @9 Q7 @! D. @4 B# B. W5 h0 h1 o
        unsigned int packet_cout;+ |% h( z) C$ `3 X2 c; `/ L3 x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 p" j7 B; r( s

. h0 ^, h+ |' t% t3 Jvoid read_MSG_buffer(int *baseaddr);
# e7 o! @, n  V5 zunsigned int count_copy = 0;
7 c: G/ T* F9 T. f- [# G6 @( e$ l; l+ [1 J: |7 I# b
int main()
0 a8 E. u/ `( x3 ^{1 o' A  |- \% P" t5 H$ s% N
        int fd;( v! |* G$ s. M* A% ]
        int *mem = NULL;: V0 V6 O7 Q/ |' X
2 ~3 U$ n+ G& ~5 J* O/ ^( a, w
        if((fd = open("/dev/mem", O_RDWR)) <0)
5 o& O& g' l% E4 H8 N! X$ b; @        {, I& R  F. _3 a$ \1 T, T/ F& S% j
                perror("open error");1 X  h) r2 k% M3 q
                return -1;( L: U$ N5 r  l" X; t$ L
        }! p$ q/ y5 j, B
        
' |( D. D2 D2 l0 v2 e0 X! {- t        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 B+ X0 \9 g" |! _- R4 E$ z
& c  M( v  m; i, T
        while(1)
. @0 e, _9 W2 g+ b9 I        {4 c4 X9 b9 B4 L; c' C# a0 x
                read_MSG_buffer(mem);# l$ b8 R: H' i, A8 w) N
        }                1 s0 y$ g. d0 [6 u# s7 Z( [" q, R& ^
}
/ @/ C- }7 Y) b; Q% z" d3 F
. O+ y- D( W0 x& R4 M$ gvoid read_MSG_buffer(int *baseaddr)
  d4 J7 p  p7 T  j% P- {# a{
1 m- a( A' ]8 ~$ s/ n& x( X! n& Y- m        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 B0 O6 x+ Y& O3 t( k& O: w. E0 B; D. W! E
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 f5 g# b) A, C
* |: N  {9 }/ e; e6 }9 ~
        if(pshreRAM->packet_cout != count_copy)
. A4 ~  ~) l) ^  l/ i        {
- P* Z" p& J& e0 X& `0 |3 X; \                printf("a is %d\n", pshreRAM->a);; H! w& ?9 {3 o, f0 X9 [3 z
                printf("b is %d\n", pshreRAM->b);
" ?5 Y% t! |7 `. O. Q( B9 U! ?                printf("count is %d\n", pshreRAM->packet_cout);* i4 J7 x: m& D1 o2 X) x
                count_copy = pshreRAM->packet_cout;
9 E8 u: F, _+ I/ F! ?+ K# b7 C        }9 ]' @- _7 f, x! A# d6 j1 u7 l
        else7 x+ }8 _8 Q% q6 m, T# M
        {$ V8 a2 X6 u  Q  ~" h
                printf("No effective message!\n");
1 ]) i; f$ b$ y        }& E" I& ~! `8 y: Y8 k! Q# ^* Q
}- E) H$ C- J# L; u- C  C0 T

6 n4 v+ }- j/ h' i- K9 ^没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& r. _3 T; d$ P9 ]! L

8 _8 U# r0 H3 d6 C7 |% ?) K" }& i: F+ C! E
& Y; _. s+ z. C' _  ~, L+ \" @8 Q

+ y& ?8 q, P8 ~, G1 t" V9 x1 _. x




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