嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: g, i  B5 S9 F0 q4 k: d, @) Y: v+ W0 ]6 h( A. o  ~. f: P0 {) i3 b
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: y& s3 F1 v. I8 B4 F#include <unistd.h>$ ~9 y7 N% _1 u; i
#include <sys/mman.h>
) o" k' a4 X' D4 H2 o0 `3 Q8 W#include <sys/types.h>. K9 h. Z# p: K( t
#include <fcntl.h>
5 P/ W5 O% l4 P$ Z  j8 F& S
. B* U- ]3 ~7 B- k8 \7 \7 q#define SHAER_RAM_BASE_ADDR    (0x80000000)   " f5 P$ _7 `; n, `* |
, Q' `7 r$ a1 q! r9 W- T
typedef struct0 ]& D' I" o4 j" q- [
{
( o8 c2 b% f: S4 e  M2 l        unsigned int a;
' m; ~9 B# @  z5 T0 x0 Y' c4 o        unsigned int b;
% V" P* z; K: P        unsigned int packet_cout;8 a5 N, c4 \& L# J- l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 ^& K- x8 f$ d7 Z+ l" C
! E1 ?( T6 g4 N5 _1 t" [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 K) ~  d! M4 r( a' |8 Cunsigned int count_copy = 0;$ J$ {/ O6 L8 c+ y) z

1 s" i5 d( Z& g) v2 m% [( E5 k$ g' x0 c% w  S& Q
int main()8 D# i# Y. F; Z+ N+ E
{
! Q) N* w4 i5 v! L/ s; Y* c# i        pRX_MSG_PROTOCOL pshreRAM = NULL;, s0 Q0 Q0 s* s- V, r" i" y
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, A  a% w3 [, Y6 p7 v
1 n. O. S0 c7 Z/ v% n7 i* {7 o7 x
        while(1)& I! z5 t3 |( J! Y
        {
2 q0 H# P; _% R+ Z/ X3 h                read_MSG_buffer(pshreRAM);5 A* c! e' W- g& E  W; O
        }                / a. b( |: j# p$ c
}& I0 C  `: r$ S: X* Y  d! R

2 L2 ^$ `1 H% I* Z% [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
0 h; s- s# w6 i2 S1 N{, v( Z# t0 u) q0 t
        RX_MSG_PROTOCOL buf;
. ~& T& a) s% j; t8 P: j( l        
2 x( A- C  q1 m% A0 H: t        buf.a = pshreRAM->a;
8 x2 r( o: g6 Z4 e+ y; I9 D  A2 P        buf.b = pshreRAM->b;) K8 @5 O  h% N1 c1 e
        buf.packet_cout = pshreRAM->packet_cout;
) z$ t) u5 Q/ r+ i5 p        
+ D: J' U/ k" E% p$ K+ m+ i" }        if(buf.packet_cout != count_copy)
- U" T8 R* c) N4 u: t8 t        {
/ _) Q; x' N! o8 T% N( k: p* m  J9 S                printf("a is %d\n", buf.a);; T4 u8 ~* |! ~  q  c! }" M2 ~9 x
                printf("b is %d\n", buf.b);* b9 q4 {: b8 L
                printf("count is %d\n", buf.packet_cout);
0 v' ?/ Q) `+ f& n) @2 J+ w" O7 o                count_copy = buf.packet_cout;. `; }2 F; x1 P& u, I) O3 M! @
        }
2 v  ?* a# }4 M! _. B        else
9 E! P( ^7 @, q7 v: z3 ^        {3 k" C- \! f* n7 k" r+ \
                printf("No effective message!");' Q( m9 x7 g/ @- |4 E2 @/ c3 g
        }) Y4 h3 f0 b) Q$ y3 a, w
}2 ?! C6 h3 |8 C) k" W6 K+ h* f

# o- u' C, X/ ]$ L+ ~
0 m4 ~# z1 e! ?但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 |% H) }9 j* g% J# P, M使用下面代码,对内存使用了mmap函数后:
1 [5 {) Y2 @, y0 G1 V#include <stdio.h>
) g2 Q5 i& F9 _! ^$ Q) g$ f#include <unistd.h>
6 T6 i( O" s% }#include <sys/mman.h>  P3 q3 ^0 i9 I, h5 U4 p/ C
#include <sys/types.h>
4 r+ s3 m  J' Z. u5 W! J#include <fcntl.h>. j, Y' t/ \& F$ _4 _4 t$ f  d5 v
6 ^. N+ r5 M# s6 L$ A
#define SHAER_RAM_BASE_ADDR    (0x80000000)  F1 q' T4 t) k
#define SHAER_RAM_SIZE         (0x20000)   5 l1 t8 r( q. Z% o  }
# Q7 G/ p* A4 P6 V' m
typedef struct* l$ `. C: x* n% Y
{
, X1 F" r+ ^  F" N: W        unsigned int a;
0 E( K7 g2 U" T8 I        unsigned int b;! w1 l% J) J! _/ o3 D1 W
        unsigned int packet_cout;
  J7 T) O* Q* ~' R& a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& j% ?: a8 s- @" z3 A' f6 q, [0 J. l
) c( m" n  a; l3 K2 J' V  pvoid read_MSG_buffer(int *baseaddr);
1 ^8 }, O2 [" w6 |0 junsigned int count_copy = 0;9 @* ^+ J1 H: C1 ?- p" j- C) |2 v
% I; V# f  l( t
int main()
6 g3 o) Z+ y& Z& D+ u& J{* m: T1 o; T! ~) J* u5 I' E# K
        int fd;/ W+ U4 I3 P1 c
        int *mem = NULL;
! F, V1 ^+ M1 A- W  s6 t) {& C( I* w$ A6 p9 j
        if((fd = open("/dev/mem", O_RDWR)) <0)9 v4 t! Q* `# d
        {
0 t6 m8 R6 j" O                perror("open error");
# }' }. ^/ U5 H# B$ r2 v3 L; g                return -1;$ ]( u3 [: s  b/ s! @' }7 z; E
        }$ O' t/ F8 L5 D6 X7 _# z& Q
        / \  x* _& ]2 D) S/ o- Y
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 u8 U5 r" r% @, H) x% L

% k2 u' ^" z) F* U        while(1)' q% p  E( @! Q5 U" k
        {: E9 A* i6 }% A
                read_MSG_buffer(mem);0 t5 w5 Q- X% j# S
        }                4 B9 p; v6 \! f. q; Z6 Y5 j# Y
}- y0 |  C7 `' Y2 o
, b; }- S' ^: D* b
void read_MSG_buffer(int *baseaddr)$ E3 m' ~" A+ Y9 J  ?; y
{
7 E# r* d; \. Z2 M1 F        pRX_MSG_PROTOCOL pshreRAM = NULL;
" a; x& X: D8 v' D' o" J: w& v5 K9 ~) v' Z9 ?0 t1 O
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& K! \6 C9 X* L0 l
7 y2 w- s( u  o& R        if(pshreRAM->packet_cout != count_copy)1 a6 B* @4 V5 K2 g5 P3 q" k
        {
2 I7 p. E4 p; r2 d& |                printf("a is %d\n", pshreRAM->a);7 ?7 j/ W  a* @+ ]. |% G% f
                printf("b is %d\n", pshreRAM->b);
7 ^7 L2 p% i) x6 r7 ?2 C                printf("count is %d\n", pshreRAM->packet_cout);
8 a3 N1 a8 R4 X$ @' y                count_copy = pshreRAM->packet_cout;6 P) p' u7 z5 O5 X
        }! R9 e3 Y  ]: @$ e; Y0 g3 _5 s& [
        else1 O( x( d; x9 w( ~! F  Q
        {
' a: C& e1 |! s% j4 S0 l                printf("No effective message!\n");
( a# A6 V( C% W8 N9 p) E9 Y        }
/ x4 r. ?9 ?: x5 a$ X}1 m/ f8 `3 y0 v

; |3 F& g4 f8 G  Z# J& T没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 U+ D8 [& H, x
2 C- k" k; \" D8 }* o3 a4 ?
% C1 Y# B  W9 }8 O  r
, f% s2 R0 C& D: X9 U" {5 `- m! @3 ]& ]
+ c3 v9 R# m  ~# v# Y




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