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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, O5 L% Z7 _, ^+ ~; M  c; P9 H+ V0 H& h- o4 v/ f+ q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 q1 P6 a/ {6 h1 B/ b' x#include <unistd.h>  c: [! ^" V! @# w! [8 u5 E
#include <sys/mman.h>
+ w+ z- y( B* Y; m' D- _& M1 y0 v( o5 E#include <sys/types.h>
& n& A( C- k, V3 i6 X#include <fcntl.h>5 G; L+ Z, f5 u4 A# I

- ?9 F# U' Z% _8 D/ O6 G( f#define SHAER_RAM_BASE_ADDR    (0x80000000)   # |6 U! z. n$ Y, s
% \6 y4 D1 o1 S( H% j( z6 ~1 ]* e
typedef struct
+ e0 F* \( Y4 z$ P9 p{
" |* R) C& F6 g5 |8 _3 {8 z        unsigned int a;
: O7 a9 ~. D, F( J5 {3 x) i        unsigned int b;+ p+ @. ?1 T' M$ s" ^
        unsigned int packet_cout;
0 B9 K& V& s: f/ W7 ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; t: ~, x! T% W( |( R: \) f" N* x# t
+ X  r2 _' y. u' b- _8 {' qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);! L0 p2 k2 P8 N( E  q
unsigned int count_copy = 0;2 N8 e6 n3 U* y( ?, A

- ~$ p! F3 @, n. Y0 m
, M, e$ n3 \$ b1 t* E# tint main()) W, l2 I+ Z4 g( _
{
# U9 W! p6 n5 |        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 {1 {3 ^, h& y( c, j* s        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  A/ W! {" e) M$ p' y
  e2 G5 P$ ?2 O
        while(1)
* @. C8 l6 ~3 f  r! S) L8 O        {! f% C; R% z0 N9 `+ x" b( l& M* D: x3 d
                read_MSG_buffer(pshreRAM);
( `. E) K" r* j$ h: |        }               
2 F7 j; w" |8 {$ Z}
' C7 n6 r' Y9 A9 Q* q% l
, u2 S0 u0 V( v1 yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( \8 u! ?9 `2 ^& b: |  k' ~{
4 f; `7 ]; Y+ Y0 W0 c) C0 R        RX_MSG_PROTOCOL buf;" _( A, G  U. B: p; A: x
        
4 i/ X! n. {; c# x! l! O        buf.a = pshreRAM->a;
5 F/ b" x1 T8 c, g* |# h        buf.b = pshreRAM->b;
1 d5 C& |. o, U2 x* M& ~: c        buf.packet_cout = pshreRAM->packet_cout;2 G, K, g( T: d2 B
        
8 N9 k9 \/ K, s4 C* \        if(buf.packet_cout != count_copy)
5 g; B' b, S9 e        {; o( k( o7 T& H0 M- x: Z
                printf("a is %d\n", buf.a);
2 B' N& C# c7 R8 u: Y; @2 ^2 y/ R                printf("b is %d\n", buf.b);
! G3 w( h( g5 }) ~" X3 x                printf("count is %d\n", buf.packet_cout);
- Z3 z' k8 }- b( w  L% f0 O; e                count_copy = buf.packet_cout;& x. |& }6 _6 D1 ^& w& `
        }
8 \0 I" _! T2 T2 K2 ]        else/ C0 t! \* v6 ~) G6 A
        {1 S2 P8 t+ X, c) U, X: v) X- k7 u
                printf("No effective message!");
; F9 T, e# w- n        }$ _( }; z  P+ a' e6 W% ]
}- T0 G% v/ }8 m6 J9 G
0 q" d5 U0 ?% l7 X' f' L
2 B/ u/ c+ L3 a  M! P# V0 H
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 B& \# l% a" t
使用下面代码,对内存使用了mmap函数后:/ ?. C* ]+ G' P6 ]
#include <stdio.h>2 k; x( N# X0 G& P
#include <unistd.h>  ~* i4 Y1 E$ k4 p. W  T
#include <sys/mman.h>
+ M# w8 j# l9 e& o( `#include <sys/types.h>9 C/ ~7 U, f  ^1 O' ?& t& d$ F
#include <fcntl.h>
' f' Q7 d1 ]' G: i# z7 j: Y, _; \6 ~( Y! r
#define SHAER_RAM_BASE_ADDR    (0x80000000)
5 v- B+ p: J* w4 O. R, U#define SHAER_RAM_SIZE         (0x20000)   $ c! Z: x" y0 w+ x
9 m  X( w+ u& ~) @% r% L/ y
typedef struct" r" A9 ~7 {. p9 U- F! \" o0 ?
{7 D3 Z3 e" Q5 {" H8 F! i
        unsigned int a;
7 k4 {9 B# f7 l2 a  C1 Z        unsigned int b;
' m# T, d$ l, B; ]& i1 W& d1 i4 Z        unsigned int packet_cout;
/ M3 o7 b& q0 q, }8 \3 \1 M" A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; p7 E3 D' j. C/ q* o4 q1 @! ~; T3 i& n: o
void read_MSG_buffer(int *baseaddr);
* I( ^$ H2 Q0 |6 munsigned int count_copy = 0;
$ l! j3 @5 M8 O0 X  Q4 E, G. s% z" C# s& @; h3 a
int main()' e1 x& B& j" ^4 L8 ^3 ~& V
{
7 O& j% M& |4 l8 B3 A        int fd;
# I9 l. P, J8 n5 I4 t- `        int *mem = NULL;
5 Z+ b$ ^' i9 P2 E" h3 h" J8 C7 X1 ^
        if((fd = open("/dev/mem", O_RDWR)) <0)2 X& A) V7 y6 |  R. r1 v
        {- J4 q3 A5 N4 S. H, J: O8 x; D
                perror("open error");
2 f8 B/ H0 q7 C                return -1;  _2 ?# Z* s. ~* z% s& K0 u
        }
: W. a7 ?$ r0 H- s6 f        . @0 }. f- n2 W# u$ A8 e9 p: J1 J
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( m1 q/ `1 u5 b1 A* o. D, C  u6 N, u+ |8 f+ v
        while(1)& }9 f' O# P! n6 w  G& K
        {( i8 C8 c' d5 z7 f/ O* L
                read_MSG_buffer(mem);
0 v5 g: q& R  J. V% a& `        }                7 |3 `( S2 E/ f" x1 e# m3 c
}
3 x% O  S# l- N' ~  X* B" H" L4 _. S" _+ W
void read_MSG_buffer(int *baseaddr)
' O: P( q3 k  P' `; F3 f{- t8 _' H: X( \. c
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 m1 {0 x$ d( t9 [) |
0 ^8 n2 ?4 T6 B4 f- [, g) c* x
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 I2 o. s! a- Y% T- d6 @
( u- ~" h1 l5 z        if(pshreRAM->packet_cout != count_copy)
0 l0 o) A  }9 l& u5 C        {
# f. K9 T. l: G2 I                printf("a is %d\n", pshreRAM->a);" [  N% g7 E5 @9 ~( d) X' x
                printf("b is %d\n", pshreRAM->b);
7 `% c) Q2 ~- F3 W7 a8 P                printf("count is %d\n", pshreRAM->packet_cout);. G# I% m  r( Z$ _
                count_copy = pshreRAM->packet_cout;) r6 q3 {( G/ P- P$ h
        }
& `7 |8 V. Z: l        else
  `! G  u- [) n1 Z/ R' V1 u        {8 k$ F6 D- @9 I  g7 c6 {# H1 g
                printf("No effective message!\n");
' c! f9 K7 X) w2 r  l2 ]        }
: _- G# I) W, b- ^/ G6 ?4 K% w}' r9 ?9 Y) m3 f. U. K7 t8 P

" Q8 M3 u9 }; C# d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 i/ s& X/ g8 Y# l. Y9 @/ H* S3 J6 G
. w$ U8 V( f, h) h* s6 z/ \' z2 t, D
0 @9 u2 u: v, n: B+ ~, E
& X7 U, G& @6 A' d* L/ ]$ _! j4 G

2 J4 x0 v) @; g+ s' a( g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-18 06:25 , Processed in 0.046529 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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