OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  |/ O* g8 {  F3 B$ L% k/ ^  o! A9 e, H  Z  Z9 n; u! \4 ^8 K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: }0 @  g5 P4 ]+ C/ X' O#include <unistd.h>
$ `+ y* R/ d+ b  P4 t/ {#include <sys/mman.h>6 h) X/ o2 H5 K8 Z. Q
#include <sys/types.h>. y5 q$ p4 }3 W6 @4 X
#include <fcntl.h>
. K5 }. n, _4 D6 A. s6 e4 z- z: Y4 L# Y- F1 ?+ V
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
7 g6 a+ Y& e$ X) M) i+ H2 R8 ~
" a+ k  ]+ x& h( wtypedef struct! ^) u3 _8 s, @* W
{2 ?# g: ]( l+ {  J3 N; |
        unsigned int a;! C6 A( }0 r- Z2 x$ t1 ]8 B6 f
        unsigned int b;
6 v1 J- A& P; ?$ o8 O0 f- R        unsigned int packet_cout;8 Z* ~1 U% ~  u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  a5 p& U0 V$ D4 T, x9 R
* u) f1 A: X% O9 Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 H, Z5 E3 I& c
unsigned int count_copy = 0;
" Y& b- _- C# v6 A
; `! e7 p0 c. P( E) Z
# e0 M( `- h  `, i% E: |$ @8 iint main()+ Q: u0 N# U9 Z8 O5 r; f% Y
{
; j/ [/ @) w7 S2 c# Y        pRX_MSG_PROTOCOL pshreRAM = NULL;% {5 ?. Q& C3 {+ R1 _
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ I8 D/ }( X2 |: \. D2 x4 s* r. E% D" w
        while(1)
; D  g  Y) ]4 K        {
1 `- I5 E) `' a                read_MSG_buffer(pshreRAM);
( ]* B# f4 X0 J7 Z" r) L" p" ^2 e        }                0 ?0 M! j6 d% T& _
}
( d4 f9 B& I0 o8 r' ^# o) d9 a% s" B( d+ [
' B7 ]& h6 f. N" d% Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' O9 I/ r: h4 ^; w1 P{2 U/ V/ v7 C, B8 T. @* d, o
        RX_MSG_PROTOCOL buf;% ~- i1 k# m) \) r6 p
        
* [$ V' t) i* u' x9 F1 k% E8 e9 H        buf.a = pshreRAM->a;
$ A) ~* f! Y5 e2 Z+ U% \        buf.b = pshreRAM->b;9 T( Q# u+ q% o% y
        buf.packet_cout = pshreRAM->packet_cout;# E9 x3 g0 m- U* f* e1 J) p
        
. f; q, O3 T! @, A5 c8 L! g        if(buf.packet_cout != count_copy)
0 @0 a- Q- [. s9 o" M/ y        {, X0 d" u9 l2 ~! {& }8 V, l. f" @
                printf("a is %d\n", buf.a);
$ e7 p* G0 @+ k# N- f: l) r                printf("b is %d\n", buf.b);$ Y! G' {+ F6 b2 t8 e% Y0 t) J/ h# l
                printf("count is %d\n", buf.packet_cout);
0 l! H9 G, K; O3 G# x' M                count_copy = buf.packet_cout;+ k. P% Z# G7 c- \; [0 }& A
        }
! x2 i- p, D4 m/ j) S        else
) D, k/ z& e1 S& `1 z! I) @$ I        {
  h9 V5 W* d  @2 ~7 D; ~                printf("No effective message!");
; \" f  Y- S: ?        }
4 J4 B( {1 n/ H. w6 ?. H0 N: {0 f}
/ T* \8 ^/ f+ u; K2 X5 i# e* D& x, b* J0 X9 M

  {3 ^- ?, ~4 b但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( \$ p& |# ~$ _9 \! |5 ^6 ~6 |
使用下面代码,对内存使用了mmap函数后:3 Y( l+ F4 e, a2 t% ]
#include <stdio.h>
4 h' z0 j' Y; K& A#include <unistd.h>
* L4 b8 _( m5 c8 h4 F#include <sys/mman.h>
% q7 r. I" c. }$ f' z2 v#include <sys/types.h>% h- |) D% [% d  L" f& l
#include <fcntl.h>3 S4 M' q, {- c$ q. ~! X
7 d, A, E2 K6 a( R
#define SHAER_RAM_BASE_ADDR    (0x80000000)
" Y, P" M% i! |8 v. M#define SHAER_RAM_SIZE         (0x20000)   : L: W- ]* R. {

' X; p1 v, H; K% n: `typedef struct
$ w4 E" Q1 B) U* n* G0 `{
! ^4 @4 r9 o0 `% E3 l        unsigned int a;* n3 S6 U' \% I, ^! |* {( o
        unsigned int b;
( i7 E+ D% y  K' B, V        unsigned int packet_cout;8 ?! Z+ m! t/ \% g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 o- O+ G& X+ p/ V1 t

; I/ C$ q' t+ s4 H( W3 [7 R9 v/ Cvoid read_MSG_buffer(int *baseaddr);7 u6 Y5 ]: k$ D" R7 _! ?
unsigned int count_copy = 0;
7 q8 c2 n' V$ }
. n: K/ P. J9 H; Y( q3 w1 D' Sint main()3 D/ k$ ]* _! Y
{2 i& B  l2 N' D; f
        int fd;
$ `! _+ \# Q, S; c: ?2 `        int *mem = NULL;
1 m% @, T3 N/ t* k( `) m" D
# _, Z; G0 Y* i/ v! ]' h        if((fd = open("/dev/mem", O_RDWR)) <0)
6 E  y- R1 e- Y8 d0 e. `" b        {
% C& F% l8 m: ]/ N; n0 }                perror("open error");
4 _4 g! H6 i2 G2 P                return -1;
4 P& x- f! H2 m  A0 I; N8 F        }5 N' ?& K) `* C4 y+ q
        
! [0 d/ i- `$ D% L8 ~! x+ t        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);/ |) t3 P. c# A8 N

. C  I  ]7 v. o5 [8 l  F        while(1)0 `, e0 G8 K& j# u  z
        {* d0 q( ]# y) g7 w
                read_MSG_buffer(mem);
. q: B- z, f5 N! U        }               
% J9 d& \' O+ ?4 U}
3 ]9 {: ~4 j  T0 C9 w! m2 B
- f* D$ `' f1 P* x8 x7 |. r  evoid read_MSG_buffer(int *baseaddr)3 L- o, M  X3 T
{3 I* m# X6 |4 w; k- e- k7 K6 U
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  s/ y6 J3 O3 c2 Q  W& x* m
+ `7 I( R0 |* X' G, {        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- S5 F6 |) f( R8 V) C& A% m/ N2 {  q2 Y
        if(pshreRAM->packet_cout != count_copy)
+ u! F0 t2 t" k' H        {
# ]. t* O# ?9 j, ?. Z1 w                printf("a is %d\n", pshreRAM->a);
4 [, \+ T" k; s+ t; ?( E$ @                printf("b is %d\n", pshreRAM->b);
' T) S" D0 k9 \9 {/ E. p                printf("count is %d\n", pshreRAM->packet_cout);8 Q  e, T- l- v7 ~, g) C  k
                count_copy = pshreRAM->packet_cout;
" l; i( ?" n0 i+ t  E        }3 |6 D1 z. e7 p$ ?# W# Z
        else
0 z+ F7 |: D0 \, E        {
1 O. ^9 N& p( f0 p3 U- u                printf("No effective message!\n");: R6 l7 s& Q6 k+ h
        }/ L' I# m  R9 ]* `: C
}* p& A, H6 X9 c# k8 x9 W# `+ _

& o* ~6 x* y% v2 i( Z9 W- P没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???8 E# s, w% [# p4 t. T
8 w1 A% ^3 D  @' ]5 k- s4 @' r) A
) C* G1 U) U( p" m) \! e

3 S6 v+ T( y. |! _* n0 Z
  {, |* u: u: j0 C+ Y( g9 f5 p8 S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-30 02:48 , Processed in 0.036978 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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