嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ k( f$ c8 o3 @3 l
2 ~/ p. ]( l* z- t9 ?, M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( f& H5 E+ H+ F
#include <unistd.h>
1 D* F/ p5 ]% ?/ u* z) H8 f
#include <sys/mman.h>
6 o% b1 V1 f3 C$ f& b) F( X# i1 O
#include <sys/types.h>
8 h# b# g9 J! V6 ` K
#include <fcntl.h>
( [$ W' a- _) L' n
6 g: y6 d) k" [1 N$ b9 s* \ E2 J
#define SHAER_RAM_BASE_ADDR (0x80000000)
; a5 E- c) _( S, W1 }$ f( W
6 J) s. ]$ J M- U2 K0 T
typedef struct
4 e4 f$ q _( e
{
0 K- F3 u$ @9 h2 `* \
unsigned int a;
% x% T1 F/ _5 h: `0 x6 o6 h
unsigned int b;
5 C: _1 Y7 k3 \0 T: Y3 C( U) O
unsigned int packet_cout;
0 y9 c) A0 a5 R/ O6 {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 z8 C9 w I+ s
* g4 L$ F: j$ U+ d; C0 U: y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% F k5 M$ H1 `6 @( ]% H
unsigned int count_copy = 0;
6 U3 K. V) _. Q2 ~0 g
0 R0 m& J* p% j" d& B. m
" L" F! B! T# m1 p) u
int main()
+ S! [" E( K0 q1 G5 `; U! w: W
{
- w @" D; k. }6 b" i8 X5 {
pRX_MSG_PROTOCOL pshreRAM = NULL;
- U" y B: @7 {
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% g7 k$ g7 b) k9 f- n. e) {
& v/ g% i, R3 w4 c
while(1)
7 g9 w3 \, t! |9 [8 |
{
5 v- R5 y; S! z3 o
read_MSG_buffer(pshreRAM);
8 W* K. y m- x0 }# h% \* g
}
) O0 t* g: p* m
}
0 m. C3 y6 Z9 N
( i" V% F* y6 D) O3 m. q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: v& c+ ?5 u% |
{
) E9 F5 S7 T! l t7 I% q
RX_MSG_PROTOCOL buf;
4 l6 x, Y' q" z* f" b: _
! T! p# Z# W0 [$ H* l& Q
buf.a = pshreRAM->a;
4 |8 D. f/ Z' F' x
buf.b = pshreRAM->b;
0 l2 M* v) T }
buf.packet_cout = pshreRAM->packet_cout;
$ g' X" m1 Z' j7 U) [ b y
! X0 j. I( c9 s0 ~' D) H/ P ?
if(buf.packet_cout != count_copy)
2 `: r( l& Z1 T$ w& D
{
! v9 t' e% R1 t( L' V2 \' ] G
printf("a is %d\n", buf.a);
/ }# t8 b2 t6 a7 i9 C6 U
printf("b is %d\n", buf.b);
5 g* d3 j v% E
printf("count is %d\n", buf.packet_cout);
) P" j! d( C* Y/ Y; |* H7 |( t: A
count_copy = buf.packet_cout;
3 j2 C% a. x7 n/ d
}
+ @$ d% P7 l5 {! A) ?
else
. p8 ?3 n; ?% b* d) j/ w3 o3 A/ `
{
n. L$ i% a7 K! f! M! [9 \
printf("No effective message!");
v4 v" G2 Y0 i4 c) `% d
}
9 b7 B* P# |, g5 X1 k
}
! a4 R/ q( E4 x% ^6 y7 m
% A' S# l% V9 U/ w7 }
. ^/ T/ A7 L* v: }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ u, k7 w: i3 r9 \3 X; ]
使用下面代码,对内存使用了mmap函数后:
- J$ C7 |( D. r& {: U; J
#include <stdio.h>
' I' f; P6 i' A
#include <unistd.h>
6 c2 Q- L& L( Z$ ] u8 ^
#include <sys/mman.h>
* D4 N! S& i ^2 k0 s$ _4 k
#include <sys/types.h>
6 E" `1 ^3 J$ B# L5 S
#include <fcntl.h>
) x4 ~9 }# P+ c( j& w( t: |
! @* y+ V" n& B( [3 x) @
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 `/ x, T9 k |0 A6 j: o
#define SHAER_RAM_SIZE (0x20000)
2 w4 k3 m0 u" [4 W' }. J$ H. y
4 H; V! ~$ ^9 y8 |
typedef struct
8 }2 a' X3 A6 ]4 U
{
+ }4 u, { d. v* W8 M
unsigned int a;
% O3 u* f l# c w# ~
unsigned int b;
$ B/ m: l5 i% r4 V
unsigned int packet_cout;
5 V Y+ V: P) V" v# P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ ^6 C) i5 v0 U7 }
$ M& q$ j T e: ^' {. J: c( j
void read_MSG_buffer(int *baseaddr);
7 p' L4 F4 i' A
unsigned int count_copy = 0;
; T4 m6 k6 W; }5 t' h
' Q M1 ?: e( T) y2 f1 y$ l+ J
int main()
( R5 S9 K) |$ E1 V' U7 J$ A
{
% S1 {9 ?/ q. u' D1 l6 k
int fd;
8 ?. r* j. l1 V r
int *mem = NULL;
6 ~$ M3 H- c9 ~; f4 i
( j) t$ k# Z, K+ q# k
if((fd = open("/dev/mem", O_RDWR)) <0)
+ e: U1 b! ?" @6 i k
{
9 `: m8 g2 X% a7 e5 b, A
perror("open error");
- l1 k4 |0 R" a) M) S
return -1;
% j- ]) @5 ^$ Y- `- j4 x9 R
}
8 ^% _+ c+ t# S. ?& Y5 s. v6 j/ g
+ N( t" o# B' U- x4 i
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' c8 S# F" @: j w) Q; w( a4 P
5 D9 {% v' q& K) L0 x3 d
while(1)
; C! x- F0 j; r& B) K/ {, A
{
0 b' X. m. m7 a* ]( ~: C# u3 n/ \# }
read_MSG_buffer(mem);
9 y9 } q( Z# C6 _ t
}
4 g% _, D$ s) G- y5 F& P
}
' f1 p& [. `; S- U4 a: m1 n9 @
; J- s6 f2 H( Y3 ~* \
void read_MSG_buffer(int *baseaddr)
: M: t: g" ]8 S) K8 F/ ]1 f( d
{
$ p Q4 v) q$ M- }! c
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 r6 L) J! I0 ?/ l
$ r+ ~* S8 r5 M% q4 d9 I/ E) F0 |
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; Z) G! l7 E, f$ l5 o
9 \# l' q! i* W6 a" [( y" _3 I, m
if(pshreRAM->packet_cout != count_copy)
9 g2 L) K) H4 }6 w$ y
{
& z. y; k/ m1 K! A) J& P4 R6 s
printf("a is %d\n", pshreRAM->a);
1 q, j) c; a# A+ `
printf("b is %d\n", pshreRAM->b);
. A9 L/ B) V* m& N
printf("count is %d\n", pshreRAM->packet_cout);
- [+ e8 X0 K( l7 o0 `& h
count_copy = pshreRAM->packet_cout;
. K' P8 u& t' U7 M- a
}
( G: Q. c7 V, W' z
else
! M' L- A! Z: Y, Q; `3 ^6 W
{
( g* a8 g" O }1 o
printf("No effective message!\n");
+ Y7 x% _- s# r l/ W- M
}
" @! E" U+ \2 `: A& H @
}
3 [; ]4 y; p6 | Z
" L0 }$ g0 `0 o. p% A. z8 _) r1 k( J
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: {) _: ~5 {9 f
: O* r% i4 J2 X3 W+ y, }
B; T# E. z' {0 ]+ u8 s! y9 a
( u* J8 l+ c, ]
/ S' ~0 r& d) R( p' S$ b+ i
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4