嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, [8 s9 C- ~" r _6 O
9 |, v9 H, V% P7 T' `. S# i
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) _ t5 i+ m4 d3 J
#include <unistd.h>
5 O9 Y. Q- ~" s1 E1 b: e
#include <sys/mman.h>
, b# D' E5 Q& T$ e. q; {( X) E
#include <sys/types.h>
! L# P! j; ^$ R; @- |3 f
#include <fcntl.h>
* r: ^1 {% Z) W- } j
0 l6 d, e7 g2 v1 v4 f" r# _* W& j
#define SHAER_RAM_BASE_ADDR (0x80000000)
# E, V, e5 x L: k. w0 C
& S3 U6 R f p
typedef struct
. Y( c" D* ] \! Y
{
$ I4 A/ k. E6 l+ V9 [, g
unsigned int a;
" H4 v5 f4 g- ?0 L- p
unsigned int b;
( t6 J! k7 Q% U! x( V0 r* }
unsigned int packet_cout;
' P8 U4 k; i: K8 B% Z; M; |5 O0 c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 z- m/ y$ e2 t, G+ Q
' L3 I' u V4 v* |' q, R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& i" J# Z- ?' @: l6 u+ J
unsigned int count_copy = 0;
7 P6 c& B6 a3 V4 X7 r6 b" R
4 P) ^: j& [' K0 q0 z+ L
; ]; t& }# g) E W: @$ _
int main()
0 A1 T$ K* }0 t6 H% v' X
{
& J$ H: N5 l* b) ?# w
pRX_MSG_PROTOCOL pshreRAM = NULL;
! M, h# y: t; P1 M: L
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% D* F5 h% N" w5 ^3 L2 k
5 ?) U6 T% [" ~$ l4 W
while(1)
# f/ g; h$ l. h) |4 ~+ V; q# }1 u
{
0 f% q& z$ |6 X5 W5 E, I0 T$ O
read_MSG_buffer(pshreRAM);
6 K8 e4 C, `4 m j
}
+ w" Y+ x* i, q& P7 q$ B% b' m' Z4 a
}
7 |0 b# [& L- @. S2 Q. g1 C4 {
@- h2 C& F: R+ y3 m: I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ D( Y, Q/ y$ c& Z7 Y* g
{
2 g- g/ R; P0 H
RX_MSG_PROTOCOL buf;
9 f4 B0 c( M4 E( l. X1 e
9 U7 Y. `/ g6 O) o
buf.a = pshreRAM->a;
5 |* D3 k+ I: B, g6 j
buf.b = pshreRAM->b;
7 N; ^* m, }1 ?
buf.packet_cout = pshreRAM->packet_cout;
4 M, [ @6 G& o3 q, J' f+ P {
1 y& V/ C: [) D
if(buf.packet_cout != count_copy)
1 e; O8 T. g8 u
{
. q4 x% f4 s7 c& {7 ]+ R
printf("a is %d\n", buf.a);
6 h$ D& W4 J8 i9 ^* s5 C
printf("b is %d\n", buf.b);
% G- `# S" a6 ]( U7 B' o! q* C4 @
printf("count is %d\n", buf.packet_cout);
+ R1 A8 t- D9 o4 }. N5 ^
count_copy = buf.packet_cout;
+ [7 T) B! I1 q. ~% x
}
/ \% T! i J3 P( m& L* M- L, w' V
else
7 U0 e4 z/ e8 [
{
# w. x! d8 N' A) V: F
printf("No effective message!");
0 D, a! o* G" |+ V7 m& ?
}
6 U3 H; u, u# M8 @3 |* {% L
}
0 O- O7 \( W, x! i/ e0 f: ]* c. F
1 \: o$ R! _/ G- G
! b& d/ b, R9 d. R5 T
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 o" Y, X7 n5 I o' u0 m+ W
使用下面代码,对内存使用了mmap函数后:
' f2 X( d# ^6 d- ~9 t9 |1 h% l9 k
#include <stdio.h>
& G! n& i/ @1 d
#include <unistd.h>
/ k' F+ ]* a& F$ x0 P
#include <sys/mman.h>
; d% d% i' ^& |' W, m1 ^( w
#include <sys/types.h>
* [! h" k. w. s! g. s1 z
#include <fcntl.h>
7 M H; Q4 c; M: E
8 \- O7 ]% b" S. Q8 |
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 S, q/ C2 J+ |& V- D, w" ^
#define SHAER_RAM_SIZE (0x20000)
d# h4 J$ a% D- \
8 c" w1 B, A7 b T7 ~
typedef struct
+ V2 k7 ~! d+ {
{
( v5 s/ `) E) m# n% a2 M; Y8 E
unsigned int a;
0 {: g5 _ _# u! o2 M: q. O
unsigned int b;
- \+ Y: Y" _, B. w) W
unsigned int packet_cout;
& n3 h' l( x" `4 f" r. p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 @3 \( \, n: R7 z6 @2 U# k5 Q( W3 p
. ]7 K* f" d# j/ [2 O, ?7 z# g7 f, k
void read_MSG_buffer(int *baseaddr);
$ C" n0 L1 S% J2 A( J1 `/ {! U7 x
unsigned int count_copy = 0;
$ r3 F% F9 S1 ?
! R, A2 Y2 i4 O) ?2 `
int main()
+ P! H4 q7 q: _" K. t
{
6 x6 Q# K- Q$ `: ~% c; ?6 M9 X
int fd;
/ y6 ?6 X/ q, W: F& \
int *mem = NULL;
9 g9 b8 ~9 C3 W. N; e# }
7 b- e! t+ G1 X$ O+ I
if((fd = open("/dev/mem", O_RDWR)) <0)
_- Y6 s% s- H
{
& c8 J O$ t& e {% L% M% I
perror("open error");
6 g# y: n+ M/ T+ U- V4 T; b
return -1;
1 Y9 F V) @/ W/ q
}
, r% r7 B! ]: e( L0 Q" P4 q; R
7 ]: K( [1 B/ x9 {; `8 {
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& Z& F+ y' N) s2 _
$ n! M3 S! i. D
while(1)
' W! U+ Q1 c9 n# w
{
- i) ^: a5 ~* K
read_MSG_buffer(mem);
6 W& `( q, `! q& \
}
# }3 n" h+ b8 }' r$ ]: T
}
3 T1 k9 `, ?3 X) m
2 j1 t+ i3 l" f1 N8 _, M
void read_MSG_buffer(int *baseaddr)
3 N4 m: r* X% v4 N7 c9 {( E
{
% C; a2 F( Y8 n9 P5 p6 p. v$ e g
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 D, Q3 l) Z1 e+ U; \8 q
( V5 f$ Y6 |0 \) U$ b
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ U8 Q( r( m5 _
" g3 y4 T' E W7 W; _- k/ i
if(pshreRAM->packet_cout != count_copy)
- c, P8 P9 W% Q
{
( Z, Y. _: I1 X
printf("a is %d\n", pshreRAM->a);
/ D7 D) B& d9 }# [
printf("b is %d\n", pshreRAM->b);
( ^+ k' `1 c, f
printf("count is %d\n", pshreRAM->packet_cout);
8 T3 N' r5 o7 k, i' F( Y) ^% {4 W
count_copy = pshreRAM->packet_cout;
( T* _1 r5 c- N( p
}
, C/ C5 Z- ?4 z/ O
else
& i2 u2 ?4 l4 B' D* L9 G7 ~
{
. A @) l% h$ S/ H# c
printf("No effective message!\n");
+ v: u) K$ }! h
}
! J/ ^2 x% R7 U; Q+ @2 q
}
2 g8 l2 Q1 x3 S
. p0 C/ _' D0 {9 n: `6 O" A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; Z! ]/ H# w- X8 E' x
6 F$ z4 ]1 Y0 e+ z' ~5 ~7 {1 x7 C
$ I' t8 s& D# x& o4 c9 N( j7 {0 b% E
9 V1 S ]2 v* n/ W
0 t& y/ h5 O/ {6 q
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4