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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  t0 w6 \% k- C4 x
( Y! i2 K6 Z) E2 X+ `+ DOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 s4 i. `. P0 F1 A#include <unistd.h>
' J4 W. N, e; ~#include <sys/mman.h>
. {) \/ Q& d/ m, r. H. Y% M. t#include <sys/types.h>
3 G* c  z# ]# a. b6 c+ W; }" _#include <fcntl.h>9 a# F2 ~6 H7 u1 A4 W0 \# f
7 Y3 A1 }, J. \, k* D6 l, D: U
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ; v! c9 L$ Z) o
3 f7 j, ^, D: W  }2 e+ _" O! a
typedef struct
0 z5 A: c) W5 P# A2 i8 E{! x% R2 t4 W) _3 [
        unsigned int a;
! b$ s9 g8 t% q$ b& G1 _4 z/ O( A. q; j        unsigned int b;
; A) L5 T' w2 I3 ^        unsigned int packet_cout;
- Y$ o9 K% L! A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( U- r' ]$ D7 \: B2 V; K9 o) y

% ^" k5 u% p+ D: T+ R) e6 d, D* Svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 w% k' F. b& x6 [, Punsigned int count_copy = 0;
8 m% E8 b& z8 M( `# X, _, E
3 B& f9 Q& V; c& ^6 k5 X( d9 J- l# p3 m
int main()7 v% G7 M! L+ G- g& H
{# V# q" H; b6 B+ |. Z' T7 ]2 U
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  @# p/ C8 I* G        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- Q6 K- U% A1 o
$ T+ _1 G) v9 p: f( l0 N9 M
        while(1)( V4 C/ R, R# R0 V5 X. ?: O9 _# S1 ]
        {: N4 B  T2 c  Q$ S% Z2 X
                read_MSG_buffer(pshreRAM);) }" u! Z- W9 E$ g: J! m, Q
        }                4 D* d: @; R# s( H2 I
}
5 Q3 _" e+ Z6 A0 z) b, \
8 l4 v; a+ {1 W( j7 D3 w1 Q0 l6 avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- E) I6 @2 R+ t7 j
{
' h$ K9 p" K% a, o/ `        RX_MSG_PROTOCOL buf;
1 V$ ?1 V0 l- K5 V1 X        & x/ W/ V: T& m8 ^  y% T& w
        buf.a = pshreRAM->a;
2 r' b/ h9 A+ n1 ]- o        buf.b = pshreRAM->b;
3 h+ E6 c$ E4 s4 ~7 \; v        buf.packet_cout = pshreRAM->packet_cout;
! X8 q- |8 g' h        
/ h. R% `, Z/ r% E2 t1 F9 \        if(buf.packet_cout != count_copy)
4 B+ \3 d: a8 `* p        {: k! o; v. k+ ]4 P& D; Y: j6 D% @
                printf("a is %d\n", buf.a);+ t' Y6 j) j8 M3 a! b/ [
                printf("b is %d\n", buf.b);
% p, v6 F' N* v* M4 Z4 ^1 i0 S                printf("count is %d\n", buf.packet_cout);
; J$ K7 a2 i1 ^; A& Q                count_copy = buf.packet_cout;
3 I0 P1 V8 Z: B2 Z9 z) w+ z        }
. {$ P% O0 j9 r, `3 }9 X. O0 X        else8 w9 R8 h: E- u- ^* X
        {* t2 K/ M) ~, z% d% x# X
                printf("No effective message!");  V- |; ^" D( N# e  ^$ m! [
        }
' Z- L  C2 Q. H3 A* R; h" `}
) A. B( Q) E. O  i9 g+ C* ?7 H$ Y, J6 G# q) L3 R$ t
: H) Q. S4 R9 A9 b( O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, a! E1 _7 P5 Z7 [! s# d使用下面代码,对内存使用了mmap函数后:
0 O6 e. L! V  F/ q- _  f  E#include <stdio.h>* M- k8 J3 G' ]9 f/ t. Y5 U& N- o
#include <unistd.h>
  x: Z( p3 n9 w+ W( q0 t  m#include <sys/mman.h>
6 a5 y" ^- ~" N1 k  _( q4 J7 Y  T) D#include <sys/types.h>, s& q# q8 }8 k8 B
#include <fcntl.h>
% L% S* Z' A) ?; Q0 B% S
3 J0 p3 Q$ O9 e) H: F1 ^' c1 B2 e; Y2 P" W#define SHAER_RAM_BASE_ADDR    (0x80000000)
, p5 h( n; t" C! N+ r9 D! _1 `) S) U% r#define SHAER_RAM_SIZE         (0x20000)   
  h; }6 s2 E: J' a' m8 c7 [; |1 q/ g& |
typedef struct3 b1 n. u9 m$ N2 Z' i
{
2 z3 N- V. {0 A2 Y7 a; h9 m        unsigned int a;4 {5 ?9 x& q. G' _' L. G8 }
        unsigned int b;
- I( N: y: b' x! c4 t        unsigned int packet_cout;/ D, {2 `: v8 ^- H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 [4 H+ v+ K9 p' C, O" h! C' T9 s, h) a! ?
void read_MSG_buffer(int *baseaddr);# N  G& A6 T0 Z  T0 t
unsigned int count_copy = 0;  M; l1 A% B. H& s

/ \* Y$ x7 `) d; T7 _int main()* P; E. D0 t+ d, a  q- x$ S' K
{
' i7 B" b1 ^  v- P2 b        int fd;+ J' H& Z  ?7 X  v
        int *mem = NULL;3 J- `0 i) r1 x6 p6 m2 n1 C" v

! P) s* l& M0 R: q1 m7 ~* T        if((fd = open("/dev/mem", O_RDWR)) <0)
6 @  Y+ w  {* q) ^+ v: s9 v        {& i; A+ C  v" |
                perror("open error");
8 K; H* f; C% r2 X) D. K# `                return -1;; V0 v( A( t- S( i+ P/ K* r& T
        }
, v8 X2 q, O  a( g& E, f, _8 ?7 g        
/ L6 G( ]4 f4 v- i2 n        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" C. Q: m( W/ ^, f
$ V6 H+ F2 O" E& k! N% p! M6 J        while(1)8 \8 l: k$ R" C6 |, i! m) ]
        {- b6 q4 N& g, O) C0 S
                read_MSG_buffer(mem);
9 b+ ]) `1 k3 o- l9 h3 u        }                2 K) ^; U( O; f/ y2 M# b) E
}! j# g* R0 C+ d/ p2 V& w/ m

0 a& m: M1 L5 b: n- j3 rvoid read_MSG_buffer(int *baseaddr)( J1 k2 T- k! E, x1 I; l
{
* N) \: Q- G0 C; n8 |        pRX_MSG_PROTOCOL pshreRAM = NULL;
% ^8 m/ V# ~) b" h. K7 c
) M0 \; A" c/ U, O& p. l) z5 _        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 G) D" z# m% R2 z# T" G

# u. u, ^1 ?4 s/ J        if(pshreRAM->packet_cout != count_copy)
7 m; Z$ ^1 n" u- W        {
- e" x3 W% x: K3 a! @                printf("a is %d\n", pshreRAM->a);
4 t7 _; Z7 M  I: r. [# d2 D                printf("b is %d\n", pshreRAM->b);
4 ~$ W% R0 ^% ^7 P8 _7 s# o. U                printf("count is %d\n", pshreRAM->packet_cout);$ @' {! e  u" \" P( [  ^
                count_copy = pshreRAM->packet_cout;  g" B& P8 T# F
        }
4 b5 T$ j: Z: y' z- E( v$ V        else
. x. s- X& b7 {+ ]- T+ f& A, ~        {+ S! W) w! v0 J7 z! d" a( H
                printf("No effective message!\n");
* _& J2 R! U2 ]        }
; m7 U, T: y. c7 V$ n& q}
. G) ?; x# m9 n  J
: O/ T7 v$ m0 P' O没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* ^1 X  X$ y* M0 @. @9 p; l, D
, t# z, M7 n! X( k2 S  b6 p
' i2 J& I, n4 O, g
. b$ A' ]( X' ], p/ V% k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-24 17:33 , Processed in 0.040293 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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