嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ e( i: [. E6 k# {% @# N2 Y& L7 Z
; |7 h$ L" J2 A" B0 o3 y3 `
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- A0 ~6 G; F4 b
#include <unistd.h>
7 i3 b7 | S" w! B- i
#include <sys/mman.h>
# k2 t- T* c& `8 m
#include <sys/types.h>
\, c' B/ {+ I$ [
#include <fcntl.h>
/ e, {" s ~; q- g8 }9 w% [
/ M8 D, u( j- P8 g8 J: [
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 E# R5 V& G% k) t3 K
1 \# L- M* k% \9 [
typedef struct
. X* _+ ^, G; `" m: y
{
5 A4 y5 H& q' I! N. P) {/ }
unsigned int a;
! D7 k. T' \1 M% `; T) h6 i. Q1 R
unsigned int b;
. s) H8 R4 e' \* Z/ i
unsigned int packet_cout;
9 d2 n4 ^" p. {6 M$ u# W# p/ l+ ^; b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 ?; H4 b& h3 ^* k! u
" O( O) x, i: y2 t T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* z$ y; b4 ]: m3 B( [" R! j
unsigned int count_copy = 0;
# X1 t$ u) E2 h, p e6 ]* o
7 Y. F: b g' ?) T- {
6 b8 v6 A* t9 [- S7 a& |) h
int main()
5 ~4 e" k" T, E$ ]7 m: F
{
7 D, }+ I! l5 t4 Q) z
pRX_MSG_PROTOCOL pshreRAM = NULL;
K# g2 u) I N6 M
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 E6 [. m+ Y) J. x4 j2 ?5 H
6 {4 B+ X+ I6 z" [
while(1)
" P; a, A- x# `4 M
{
2 A1 I c. z$ V+ F& k
read_MSG_buffer(pshreRAM);
) l8 q$ b3 ?# D/ W* K& Q
}
' N3 Y$ e* {) v. B/ S# U4 L
}
$ l7 [" o% i/ A6 h# X' z
% Z' q0 c/ s+ l$ v8 Y- q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" w1 _& S/ @, p
{
/ G4 m) _5 q" F0 C" i
RX_MSG_PROTOCOL buf;
7 a8 x5 h% }, {5 u: r
; Z0 Y$ O v2 m0 U9 W, k' h$ ^
buf.a = pshreRAM->a;
7 [5 Y% q2 w7 q5 n
buf.b = pshreRAM->b;
1 L, [4 j/ N! f$ K8 R
buf.packet_cout = pshreRAM->packet_cout;
( `! \) j; d8 e6 b7 M2 D# f
% U+ }: l0 B8 e1 C) G" {7 l
if(buf.packet_cout != count_copy)
6 i( A1 D& ] V1 S* @
{
6 d0 C% C+ O1 h& U( p. Q
printf("a is %d\n", buf.a);
' Q: }+ r' y+ k! W% B& f5 u# e
printf("b is %d\n", buf.b);
$ Q* E. X% I, `( V X! S' b4 v
printf("count is %d\n", buf.packet_cout);
! e: _" x$ N) I
count_copy = buf.packet_cout;
# m5 ^3 H6 b5 R2 B- l$ R
}
6 r* s! Z# z$ N% i
else
' d; T$ i) |- v. X: |
{
$ ?5 G; R% u' v6 a! @
printf("No effective message!");
2 w" t. }0 y2 z' I# d0 V" y) ?
}
3 C" {: l! ? ^0 ]! T5 I2 E/ [0 e6 X
}
H% d% [$ F: L) `/ t
8 u6 ~/ I- A# D2 x
/ s1 [6 j$ c" |: _) H( S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 l( w0 l" s* W; [* [# L4 f
使用下面代码,对内存使用了mmap函数后:
3 W3 `; P- ]2 l* V' b% D) U& a( Z
#include <stdio.h>
# [- F- K. w" b& U }* W
#include <unistd.h>
8 r) y* y/ f( M% o
#include <sys/mman.h>
: l. ?* F! g* O
#include <sys/types.h>
! B* {: y) y* f, ^9 \, g" W& q
#include <fcntl.h>
" L, O/ G, i S" b" b$ `) d B
: S+ j+ f3 n @1 l; k( u& k
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 a, s( g5 h5 Q( a* P& \
#define SHAER_RAM_SIZE (0x20000)
, b' g- r* J: `! |" N- Z& Z
. I+ n$ n6 v0 a4 X* b* |7 J! q- X
typedef struct
% N6 U! K; _6 ~& F. X" @$ p
{
7 }0 d9 O8 J$ K' P6 U
unsigned int a;
; q6 @# t6 x3 w' `1 ]' t
unsigned int b;
8 y' x$ x1 T0 P7 g) f1 k% M( k
unsigned int packet_cout;
3 @# \) L+ u- f. Z {1 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 H( ^& x( u+ l! N
& E' E& a' z0 ~, q% d: I" `4 T
void read_MSG_buffer(int *baseaddr);
% ?2 Z: O& C$ ~% X E7 |* _5 h
unsigned int count_copy = 0;
6 y9 b/ t# j: v: W* G
' u* e, T: b1 J& K# ]7 ?3 u q
int main()
, F5 Q6 V! v' l1 M [ q! ~
{
8 l" l" A! I# C# w! l( l
int fd;
1 H" j3 o& H) R' P
int *mem = NULL;
2 s4 N" X6 { _3 j8 x w
- `' b. F% \) f9 d$ q" x7 t
if((fd = open("/dev/mem", O_RDWR)) <0)
$ T0 t9 x7 g" W$ U
{
' _1 N$ K8 Q: P( { `& Q
perror("open error");
; j) T# {' w$ J% q( M
return -1;
& S! b/ Y2 U) J5 ?. w9 U" [
}
7 v7 E$ f+ ^5 A, @1 Y& ^
8 p6 L# E* X6 @7 l4 K2 L
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: r1 v' I$ G7 ^1 {( G5 n/ j) M
4 {' a; D0 E) c1 F }5 v
while(1)
! _# y V& U3 T$ j( F
{
$ f) J0 }! u) z
read_MSG_buffer(mem);
- C& C8 _- C% Z3 o+ A7 h
}
6 e i/ W% j. L3 U( d* {
}
; o1 N/ M1 [# f! x4 q
0 x* ~: E, N6 e t) i$ _
void read_MSG_buffer(int *baseaddr)
1 a$ U0 N& G2 w5 n
{
' o$ C) l _8 ? E0 B, U
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 `2 o: S5 |6 S) b2 G) H! N
: s5 l% _! m7 l
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
F8 e, {% F" `, X |, i
: ] d* Y& q8 r+ z, l. V
if(pshreRAM->packet_cout != count_copy)
* I) D1 V. R7 B
{
* ?) q" E5 d4 n" S/ ^% S- j
printf("a is %d\n", pshreRAM->a);
* P, ~7 e( w, Q6 |
printf("b is %d\n", pshreRAM->b);
2 Z) Q o K+ p) l. e$ ~
printf("count is %d\n", pshreRAM->packet_cout);
* P' y) e; f7 G8 c
count_copy = pshreRAM->packet_cout;
+ F; C( x, `( _/ @
}
& R' A+ l1 G, G' y
else
2 i% V. X. f1 c8 X r
{
$ c: m3 A2 ~, ^" u6 }' U7 J
printf("No effective message!\n");
0 T. T* Y8 G% L, m s0 E! j3 F; u: L
}
# s. C; b1 } w
}
# ~, v1 }5 y0 Q: T
2 o6 w) h: [9 A: m' b1 |
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% w8 I5 \/ R4 S% U* c" i* p
+ Y( r1 w2 Z5 J
8 E% H0 S, v7 Q
3 u) x; f$ X* y5 P! P* J- ~" ]$ D
8 |% \% ^+ J' i6 E- k% P$ z
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4