嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, s) W9 G4 W4 s5 ]
! m9 D2 t0 W- Z) l3 O0 HOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( M2 t8 ]2 P* w8 ~3 U" F& p( ?#include <unistd.h>
) {' L$ @* g' B* X1 ^: b#include <sys/mman.h>
6 @/ W( ?& j' J/ Q#include <sys/types.h>6 l6 ~! m& W  e/ |; y9 b
#include <fcntl.h>. u0 i5 _) G- n+ m

) e$ q3 R( |. n5 w#define SHAER_RAM_BASE_ADDR    (0x80000000)   1 O: [: x* ^/ {; G7 J
0 b' E# p. G. h
typedef struct" O% u  `) M% V% [
{
6 L3 P$ Z! S  e, u( T, ?* Z        unsigned int a;
( M$ x' G8 [4 m' A; d( y8 _        unsigned int b;+ J- \# j) z' D
        unsigned int packet_cout;
/ e- ^: {7 m4 k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; S5 l4 R3 W0 S# l# v

# |! ^  O! i+ p' x1 ]& z" s+ yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 j3 p5 k2 d& i# s& O+ {2 J# @unsigned int count_copy = 0;6 Q! L; p& w" x" i- Q8 D
+ R. t2 E9 w0 D0 [. |; T; M) E' h
/ q* d0 h2 A* `
int main()  Q7 I# M" E% h( @7 v1 i- d
{: B/ O( h" w4 N1 h, W1 G
        pRX_MSG_PROTOCOL pshreRAM = NULL;- M& k* A8 Y& [5 m
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 [: t$ t: h8 E( l: [! w2 O+ y

4 T4 |5 ~  k# \" o. T1 D        while(1)# n) g1 l( s# |1 n1 c0 A
        {8 n* u/ A5 X& ^
                read_MSG_buffer(pshreRAM);
: A$ R1 P( k4 _9 V; h$ y        }               
6 O1 z/ \$ X& A* C9 ]2 I# c8 ?9 v: o}- [) T4 {$ u3 L, r: n4 ]  ~

7 z2 k* W; o, w0 e$ N  Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ K, I. W1 {  L$ m{/ Z4 Z, o$ t& B2 Y) A) d
        RX_MSG_PROTOCOL buf;0 g9 V5 i8 ?, ~/ s" N9 f& \
        9 e/ a7 ?- [$ J- z
        buf.a = pshreRAM->a;
# ?6 c9 _8 e& F* h+ C        buf.b = pshreRAM->b;# d. W6 C6 M# ^' f
        buf.packet_cout = pshreRAM->packet_cout;
4 L2 P# R# }3 y: ^, A        
- s- \$ K3 p, A0 i0 `) C        if(buf.packet_cout != count_copy)
% n3 A/ o6 B/ P0 \        {( m0 J9 |0 K5 ~+ x$ p" x" j
                printf("a is %d\n", buf.a);
/ Q$ {2 i( T( m$ m2 @6 h# n- l                printf("b is %d\n", buf.b);
5 {$ r! ^) j' f; b+ [9 ]) ]  \                printf("count is %d\n", buf.packet_cout);
$ v& j% H7 T4 X! o9 G% L- Z# z                count_copy = buf.packet_cout;2 v" Y. D5 s6 O' f$ s& C5 e" M. w
        }
; k* p9 Z: E+ d6 A        else% f5 [# F: Q1 q1 O* W6 H/ E0 I& @
        {+ i, k. V, P4 b- X' m- x0 A  d
                printf("No effective message!");8 S# F  T5 R9 O4 v( M; |* l! A% C
        }: W8 [, H( l, r5 O7 Q" U
}& B5 w5 e0 ^9 {" R

5 Q0 N$ @, [$ R5 R9 d% |6 E5 o
2 w  o2 o2 s, ~, j; i但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" t) u. i) C; C
使用下面代码,对内存使用了mmap函数后:
" F' \9 R' f/ X5 Z#include <stdio.h>
+ h3 j  {! H" E& w4 V2 `#include <unistd.h>
5 Z* w1 ?/ `' ?: v$ Z  o+ w#include <sys/mman.h>
4 @0 C, r) d, S8 r# r8 h+ A#include <sys/types.h>+ Y, j$ Y, `5 N; h9 X) }; y; m2 F
#include <fcntl.h>
/ r; o# y4 y5 P6 f5 c. l5 O& `4 ]$ s& q8 h* g! N0 r0 w6 r
#define SHAER_RAM_BASE_ADDR    (0x80000000)
9 T% r) z. t: k. r6 [0 s#define SHAER_RAM_SIZE         (0x20000)   
& i: Y9 u+ F2 @
0 T+ @) f# j, \/ {typedef struct" S0 l) Z8 X/ z4 M. I
{
* X" k" i2 X; Y  F1 e8 L2 e2 K4 A        unsigned int a;; c: G" R( _- \, y7 k
        unsigned int b;( f/ M3 n* g- h. P1 [
        unsigned int packet_cout;. n$ c$ [& x6 f/ q) F; Y) g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# {6 J$ v& n+ t: }' o8 V: E9 G2 l8 u
void read_MSG_buffer(int *baseaddr);% [( y3 Q1 Y$ K. q
unsigned int count_copy = 0;
+ k4 [, V: x* M+ G' A  L9 p5 A0 ?; s1 z! d! ~; c
int main()
$ J7 J6 s5 ?$ j2 H3 O0 B9 O{
1 k' l- \% S/ J, i5 Q        int fd;
& P9 T; W1 A9 a$ a        int *mem = NULL;; V$ ^4 k8 @/ M$ t, i

4 }) }  U6 u/ h6 m9 K$ g: Y9 Y        if((fd = open("/dev/mem", O_RDWR)) <0)
, H1 N& I( [8 s3 [- L6 m        {
' X. m, z9 [% v  c/ g* u                perror("open error");$ W+ A* o: I" }+ e
                return -1;
5 ], l9 _0 w7 X7 x        }
4 h- b( L( f' B& p) O( T3 b        : K: i. I- [0 w  d  [
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 a* P6 m# W; r+ y' E7 ^  C2 k! F3 D
& B" u8 m, L0 @
        while(1)* Q* s8 Q' [4 ^+ K3 H
        {
; ~  ^8 R/ O1 t                read_MSG_buffer(mem);2 @: W* Y, Z9 i: E% k2 p: u2 K& t
        }                7 J* t9 B# t; ?1 F
}$ G5 c5 G7 x. E  {( X2 }
" C+ H8 r  i! Z+ e0 }. D8 ?* x, }
void read_MSG_buffer(int *baseaddr)
2 U! r' e, w( H# c: r{$ ^/ m% S7 f  h$ O4 K. b
        pRX_MSG_PROTOCOL pshreRAM = NULL;3 j4 B. l4 O  T. o- H& f5 R

/ c$ N# i& ]( \5 ^7 p        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% x5 C( ~+ z0 R! N

7 J- R) K, A: k& @3 E; W        if(pshreRAM->packet_cout != count_copy)
. q, t2 S& |  t        {
: G6 _& _" g. k& x                printf("a is %d\n", pshreRAM->a);9 t9 f0 y' @3 t
                printf("b is %d\n", pshreRAM->b);
% {& J$ X7 Z. u! k2 v1 l7 H! e                printf("count is %d\n", pshreRAM->packet_cout);9 p3 |* V9 T6 I+ x
                count_copy = pshreRAM->packet_cout;
* k3 i" \4 M! p* U8 L9 g7 X& H        }2 g4 S4 q1 j; K( t! s5 P
        else
5 V  W$ `+ ~2 R! i" Q/ t        {' w+ L6 O# u6 s) [
                printf("No effective message!\n");( L9 |  F4 v; c3 e
        }
' t* H+ c. [) F9 J; |, ]) a$ O}0 u, `6 @5 F( G: |$ V& f# j; d! z! {
  s+ V6 \" N6 k. t3 M, |
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) u4 W. N! \- K
" N" f4 ?* ]: \3 Y" V( I. C* U
$ K' P, K* b9 R/ Q
& b% R* E8 M; A9 B2 y
9 u; G! h9 f* Z





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