OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5677|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( V% Z0 S  Q; }$ C, ?% j4 p: h3 U+ `4 u) |' {4 ?
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h># ]9 B/ G* @0 ~" \1 r1 l4 z
#include <unistd.h>  J5 Y1 J( R9 Q( k2 z
#include <sys/mman.h>( R: Z0 @# o( B+ c
#include <sys/types.h>
+ A2 N# {1 \1 U7 U, A" B#include <fcntl.h>' N0 M9 h7 x! B% Q7 S
9 f( x; I4 l+ [8 L9 L" A( |! _
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ' P. [: y. }* O3 }; A. O
/ F: m% u& t! {& q7 x
typedef struct
" y- M, `0 j: g( f% e{9 ?2 Y( x3 T3 Q$ P4 y
        unsigned int a;1 K# f/ T9 _0 r% I" V) c4 N
        unsigned int b;
# A( `& A% O3 j6 H; o5 D5 B        unsigned int packet_cout;
1 i. c+ Y( ~8 f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; Q: @% J( V  s1 ^( b5 L
1 }. R) \& ]) a/ c  H5 F5 Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
  m* \$ r3 @8 k7 C  xunsigned int count_copy = 0;7 }5 a6 {+ q/ x( ~9 ~7 n% a
- \% A/ S4 k: Y6 J2 Y; m( T
! s3 T. g' Q1 `2 O6 K
int main()7 D1 h1 z$ ~( L' H" D. s
{$ ^$ t8 x2 I. e! h; o" j" p* r: o
        pRX_MSG_PROTOCOL pshreRAM = NULL;) C: a- _' Q. [) W! [
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# l8 U: x- S5 J
0 d$ Q6 }$ E1 p( Y) D- E0 @        while(1)
- t6 V5 g, I5 o3 n$ ^& u        {
9 G+ `7 I* [, D% o8 I                read_MSG_buffer(pshreRAM);% b( B( C8 J( H- ~, P% \8 i' M5 {! }
        }               
; A  u/ G* {; r5 S* n( P1 Y}, r7 O; l) f  ^7 v8 y; q; v

. h0 r, r7 A( H9 a' avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ m3 m$ A& c3 }/ m2 T- W7 B- v
{
# u. n0 R, M) a        RX_MSG_PROTOCOL buf;
3 S- R* p6 w+ Q. n( Z! a: P8 I        
  h+ T4 z2 g# ~3 L  y        buf.a = pshreRAM->a;) e$ W6 l$ X! V0 k
        buf.b = pshreRAM->b;
1 f; n( [- I3 U. U- L. \3 b8 z' J- Q        buf.packet_cout = pshreRAM->packet_cout;
5 P; _' A  X1 P* x3 O/ m, [        3 N1 P. J6 M- V- y& p; v; i
        if(buf.packet_cout != count_copy)
4 W4 N3 H; _4 t9 D. W7 N9 m' U$ P        {
1 e1 \: \+ F8 k: }3 b                printf("a is %d\n", buf.a);$ g+ }( G9 w( U7 ]% }
                printf("b is %d\n", buf.b);
* F$ k- V9 k( D4 Q- v                printf("count is %d\n", buf.packet_cout);8 M! L, _3 c0 m+ k
                count_copy = buf.packet_cout;& ~* f# Z; j6 \5 p$ O; g# `
        }
) P0 l+ X; d0 U+ F2 n3 i        else% e8 J$ ^3 g: C7 d. Q2 v! w3 b) W/ c0 j
        {1 x% P4 r! D. y
                printf("No effective message!");
1 V) m& G) C6 i% \) H* {& E        }% X% S3 V, S! i. g* \& k
}+ o& _3 N% T+ _1 N

2 q9 }: f; A  |  E2 q% m1 p$ ?
6 ^' S" q$ T, p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 S- C6 q  s' l7 [& V, N' O. V使用下面代码,对内存使用了mmap函数后:/ H" |7 o. C+ {: w$ f
#include <stdio.h>7 n+ j$ v& A; Q' `# E7 b5 l' [- w% e
#include <unistd.h>. z) ^8 G9 `* W& w3 X. r
#include <sys/mman.h>
/ u2 h  ^5 d7 x& l1 \' m+ Q#include <sys/types.h>$ ^1 P; u! b0 H) V0 v0 g2 K
#include <fcntl.h>( L+ n2 m# y* w

( B3 p! r, X! C& L& X; F* @#define SHAER_RAM_BASE_ADDR    (0x80000000)
% ^4 v3 T5 ?  v: ^7 I" G& i#define SHAER_RAM_SIZE         (0x20000)   
8 k" S3 l: s+ K9 b8 A! ^# [: ]" h0 u# W! H4 W: \; K
typedef struct
0 e. m6 M3 f+ S" ]{6 ?4 {8 W4 ]6 Y' p4 @, s9 r( w5 I
        unsigned int a;
0 P9 K3 J6 K% [5 Z& m        unsigned int b;5 @6 K4 p( L- Z* C
        unsigned int packet_cout;
5 t1 w; a3 V( I% K/ R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 @  T4 w7 {8 I& ]0 {

# @) K3 I. f8 a+ z7 l2 y) z# c$ Qvoid read_MSG_buffer(int *baseaddr);
2 J3 J. D" L) C% k( f$ eunsigned int count_copy = 0;
; n  z# r  K/ K( |# J# i
" H3 S6 g, t" S8 @1 |. g$ Z6 h/ X1 Zint main()5 E7 {; n# ?$ t8 }! L0 k( t; s
{: N: V* v. M. A8 g, h5 f
        int fd;
* s8 |) r6 F1 q6 y        int *mem = NULL;
# |9 W# c: @  r1 i6 `, T8 H
3 Q, ^9 _7 J5 R& X        if((fd = open("/dev/mem", O_RDWR)) <0)  `, A: W% A5 l7 u% |
        {
+ ~1 z; l$ Q6 ^. J# i' e! O4 f1 s# ~                perror("open error");
3 C8 a! M" v# W1 f7 n6 z                return -1;9 L) ]! n9 F* o8 a, f
        }! N7 g5 {6 \. t' I
        $ z1 r7 T  g, J
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: F% e& M0 c6 X, f3 h' h7 Y$ D! @3 D5 s+ `4 s
        while(1)
2 \3 B! ~  {. z5 t4 D' d' [8 j        {
# |; ~/ q. [* v                read_MSG_buffer(mem);" y+ h! f5 m8 N- Z# k: S! d4 c3 G
        }               
0 l$ ~( j  D& a! c}$ z- A6 Z" t8 `
0 l0 B& ~5 W7 i; G( _5 `# @
void read_MSG_buffer(int *baseaddr)
2 P3 X9 ]  A/ z4 c* |{
& a3 ]0 P% X9 M        pRX_MSG_PROTOCOL pshreRAM = NULL;7 V9 G* z; U& l# o

# n& w. P" S' \7 y7 ^5 O& f        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 W9 h: B) E2 U0 M/ V! K
/ m$ ^2 q& _( Q; P        if(pshreRAM->packet_cout != count_copy)
9 O& [- z4 a! Q        {
6 e' L: a2 R; {, t8 |1 {' r3 Y% {/ K                printf("a is %d\n", pshreRAM->a);
5 Y/ a4 {. I9 V* r7 `) J                printf("b is %d\n", pshreRAM->b);# D& l# D! a, N9 k: \& w
                printf("count is %d\n", pshreRAM->packet_cout);0 n# G- a9 T7 c- T
                count_copy = pshreRAM->packet_cout;# }4 ~% ]6 S9 u: x
        }. T2 q) [- U5 c+ p
        else
* D+ P2 W) ]6 E: k$ a1 i1 t        {
! s# c8 w! k8 F1 |9 t                printf("No effective message!\n");9 g  V* C3 S! Z2 O9 S
        }/ E4 T* b; r: v# O( p
}
- \7 ]1 N/ U1 i  ^" Q8 A' n2 _: r; R# Z  B* O7 \
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! l3 ]) Z0 k8 A
5 H9 G* {# U! d0 A4 Z
/ J2 r2 n/ x, [6 d) }2 X
: K/ A0 s: e0 a( d4 s
# x; T9 I  O3 a5 U% O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-2-9 02:03 , Processed in 0.045421 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表