嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; K' {7 J! C. f' z
) @; x3 P- S; Y& B) k# Z- N% {
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; }7 l9 s" r, u6 t q% ]. k% g
#include <unistd.h>
& {- D! a# p0 k3 ?
#include <sys/mman.h>
; `( p7 t3 U( g& A( Q$ ]7 q
#include <sys/types.h>
! H ?, k; j4 W. [5 }2 C. V
#include <fcntl.h>
; n& k7 W5 y( i% \7 v) [
' f; ~7 s* v. E) T
#define SHAER_RAM_BASE_ADDR (0x80000000)
! u V# t! w" o6 z8 q
' Z( y8 _" W9 H L; n
typedef struct
8 B' U2 z' `. e$ E# T2 b
{
# `& Z- m/ ^- j2 `( \
unsigned int a;
: Y3 A* m' l" \: k- R
unsigned int b;
( ?( z$ d, R) ~
unsigned int packet_cout;
( ~& H) `! m- M. j, X$ Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 {3 t: H. n% u7 l% ^; r% v* j
0 a: F* _3 Q6 O! r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 q; ?3 }6 f+ {1 n6 `
unsigned int count_copy = 0;
5 A3 Z( Y) ]7 n( ~- ^ r
5 j; R6 r9 W$ q$ h+ `+ c! F6 {& T* ?
/ B: Y/ u5 N, C+ k
int main()
' v9 j- d2 b$ W! a7 S" C1 B
{
- f: F$ k5 M/ S: E8 {, o9 G! e
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ M, E$ X" }) j c. r
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- D6 i" w. a; P0 ~1 d7 f. c
% H- i2 P2 A& |; a) F6 a
while(1)
. P5 X5 I5 T' r U: n$ ]4 u
{
) }" |% M [: y2 g0 v
read_MSG_buffer(pshreRAM);
! j- L) V6 V* ?
}
3 s/ Q, {# F! ]" {: }
}
! r/ t* k9 O$ S( c
. V( j2 Z2 n8 v3 s# [3 k
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) B5 n3 ~7 X# G$ k4 y: z5 d
{
9 s# | J3 M$ A+ X* [: A
RX_MSG_PROTOCOL buf;
5 s# z' z3 ?/ y8 C
! n% z( s# W- u9 Z( R# v! {, O
buf.a = pshreRAM->a;
Z7 m' {$ q6 M
buf.b = pshreRAM->b;
6 `" O% R: t9 @! c& E9 B
buf.packet_cout = pshreRAM->packet_cout;
- w$ B! A& h' x# V' j$ t: x
& c) }# f2 y6 Z. r5 ^
if(buf.packet_cout != count_copy)
- z* v; u% W* R$ m
{
5 n0 T# x! d. Y2 x1 S8 a" M
printf("a is %d\n", buf.a);
$ t$ y8 C( B9 Q* F5 l& {( ^
printf("b is %d\n", buf.b);
" q" g% h1 ^- g4 x6 q
printf("count is %d\n", buf.packet_cout);
. p6 C1 _! [/ S) C4 i
count_copy = buf.packet_cout;
" w! {1 m V8 @! T8 E
}
$ T5 x) ]; k# c
else
: j% O, W; U1 r
{
+ z; K7 @" K' H7 i' v/ R0 E
printf("No effective message!");
2 ]+ d1 H f" u9 j3 v2 F
}
+ z3 j4 M* y" R, H; F: Y
}
6 [7 ]1 \& G8 M
$ v0 J( n' m8 {2 }* u$ ^
1 R+ L+ @) G: H9 i
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* Z$ E% z3 S+ f* U+ C t
使用下面代码,对内存使用了mmap函数后:
6 v( u( ?+ q: }8 y
#include <stdio.h>
7 c/ _1 C2 C7 C
#include <unistd.h>
* k! f3 J8 w! P: |
#include <sys/mman.h>
: d4 F3 {; ]3 Z! o1 a3 T
#include <sys/types.h>
4 o# t" g J/ p( M8 A6 v8 i) q
#include <fcntl.h>
7 c: h2 }$ G6 d1 o @
7 }9 ]; N, w. j* R R
#define SHAER_RAM_BASE_ADDR (0x80000000)
, v* `6 a" j# M
#define SHAER_RAM_SIZE (0x20000)
9 K! F$ I% |0 m0 @
! n1 b: g. K+ o& T& A; ^+ N3 u% U% m
typedef struct
% ~! U& w$ w8 K' ?8 d! ]( R/ F
{
% h: _9 V3 `" v" l, s
unsigned int a;
# D. i7 u0 d+ w( j/ {
unsigned int b;
. l7 @7 v, q+ Q' n' c0 w
unsigned int packet_cout;
" @7 z8 F9 C. L! w& e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
R+ O5 C% k4 M' F) o
( y5 S* e1 S4 |$ p
void read_MSG_buffer(int *baseaddr);
' N8 T( C( F+ O3 Z9 S, X, E
unsigned int count_copy = 0;
7 {# v3 I' ?6 D! v& t& D
# \2 N9 O, m/ d# h5 l" M9 l" Q/ X
int main()
5 v, L ?; y! e
{
' I1 E9 d {' f E' N
int fd;
8 m1 w, {. D: N7 H& k1 w% {
int *mem = NULL;
% B+ u, C( ^' B. \; A: V
+ L) ]3 l" O; t m" i# A, \; I$ U
if((fd = open("/dev/mem", O_RDWR)) <0)
$ {2 h+ E) ?1 U) U8 S: X* P1 h
{
" s* Y7 N6 F% @4 s* B
perror("open error");
2 i* l0 S7 i' ]
return -1;
y& Z7 j, j$ }! R; N3 V( V
}
$ r) C y& n. h2 N
) Q* M C, a! j' A# W$ b
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# |6 |& B1 K* s8 T' ~: G
. S* F1 M' w5 s; A
while(1)
, X' J6 g/ V1 q% z c
{
8 p, V+ L8 f r0 V4 h5 k
read_MSG_buffer(mem);
- b6 l' R) v4 a; b' i
}
8 v5 D, P6 G4 o) I' q K
}
1 N( S( |7 _' D! o* }; P
) B* p6 S# g5 I( I3 b# J
void read_MSG_buffer(int *baseaddr)
7 n B6 G; [2 M& |4 {
{
) u# M3 f( k, J6 _6 t
pRX_MSG_PROTOCOL pshreRAM = NULL;
. l7 C& I: P# T' p
& }$ m& J4 }# D
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 L6 y5 G$ @. O, b5 w, z
3 m6 a" B8 u0 J$ d
if(pshreRAM->packet_cout != count_copy)
' b7 s7 H! q- a9 F' k7 T
{
1 p# F" Q# O2 }! ]
printf("a is %d\n", pshreRAM->a);
) `5 X0 A" X5 u
printf("b is %d\n", pshreRAM->b);
' A% x% D5 _ U
printf("count is %d\n", pshreRAM->packet_cout);
" A- {0 A6 d5 y! F5 A2 o6 w
count_copy = pshreRAM->packet_cout;
/ m) C( C! u+ d& x: r0 v& f2 J; x
}
3 i2 s2 l4 R' H) l C5 Z
else
# X ]2 r/ j% b, ] ^; g" f" m5 a
{
6 q+ d# v0 ]6 ~8 D& R
printf("No effective message!\n");
: s6 B+ E3 J# F T4 a' [3 L
}
1 ]0 n" j* R0 S6 J Y0 E. D
}
, G% q9 b3 r) j q6 q2 U
, V6 W1 t$ D! n2 B2 y. X6 y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 e7 |+ T5 w6 K
4 [: t* N3 s9 y. M: E
8 o9 {- \2 x% a* l h3 X
* M$ g+ t1 G2 C" H
% R, u& ?9 Q8 {, ^+ E7 g$ R
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4