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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! i* Z( H& _) U' `; l4 ]% _& w- g' A2 `9 }! O  @8 @- r
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, n  w- R1 @4 g% i& Z% Y/ b
#include <unistd.h>/ p- J: @2 U$ E
#include <sys/mman.h>
8 j# D6 N* C; ^9 n#include <sys/types.h>
! s! m& w: Y: U7 h7 t- A! l( Y#include <fcntl.h>3 @. [9 M4 C# H: P0 J1 X3 h5 h
! M5 N+ k# I' b+ t) U0 g# t/ `
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% s0 c3 c) M3 @% j) r, P& c( p, O0 u! R" ?6 w" ]) h, H- g$ Z5 o
typedef struct
/ K& i& n9 W* E5 q{9 k) V$ F5 h3 o$ k; f
        unsigned int a;5 a8 d& j( ], _3 S2 n, `- s
        unsigned int b;: @0 A4 I* J! @9 S" N8 d: a
        unsigned int packet_cout;+ ]. [# P$ Y: B" j- ^+ d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! F/ ]1 D9 x2 J  r3 E5 `  e  q0 D3 T# g7 T2 S# W  S( m2 `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: H% }* g. [2 \2 \. c% C1 G) iunsigned int count_copy = 0;
; B) \( r1 [8 A9 @9 W$ W% B9 l) [. u0 Y* P9 n! X

* x1 K1 ]: q( Nint main()' V+ i6 ~* C5 a
{
/ q' |( V& ^5 t# R        pRX_MSG_PROTOCOL pshreRAM = NULL;: Q- G& d; Z! e4 f2 r" Z
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( S% v3 ^  t/ g& h  T3 I2 y1 C
: F0 P: }  G2 f; j0 ?        while(1): N- x& s* ^. f# E! O
        {
2 i4 r, J: [& t" C+ W2 d                read_MSG_buffer(pshreRAM);. E2 N3 d7 `9 t5 h; z
        }               
) p9 V" `( [- K- w% Y}
' a% }- o/ f6 e6 k. O$ l2 e' {! s$ [" T9 g+ r' O' }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- l' M" E, v  h$ z{0 |# E0 I8 c# J* X5 ^2 t& ~: [
        RX_MSG_PROTOCOL buf;; x8 n4 e8 }! p0 O
        + }4 Q5 m+ d- Y9 I- Y2 ], ^. v
        buf.a = pshreRAM->a;( V' s8 v, H) N
        buf.b = pshreRAM->b;  t1 W& v0 u! v$ _
        buf.packet_cout = pshreRAM->packet_cout;$ o/ Q+ u7 W% n' J
        
) a8 t1 U7 u8 R' O9 t) U% J        if(buf.packet_cout != count_copy)+ `- R: ]5 y4 ^) G, [
        {
5 f) @, N% ]- L: D0 ^$ w( Z0 z                printf("a is %d\n", buf.a);
( W; C4 w% ^: }* V                printf("b is %d\n", buf.b);
! h) H+ R/ I) f9 ]                printf("count is %d\n", buf.packet_cout);7 P$ }4 C0 D  v2 d$ K
                count_copy = buf.packet_cout;' h! F! R( z7 k) n% l3 Q& ~, p
        }
* G+ }( J3 U* v        else
2 x; T) E/ |% }        {
( y( U9 W9 O0 t3 ]) y% j+ y                printf("No effective message!");
. T% Q1 @- k1 B) u% Z        }. Q( `3 x1 l( C# D
}
7 Q; b* r) e* I4 L3 O; w9 @1 L6 [6 p7 G  a/ ?" v

" m0 I; H/ [) t2 S' Q但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" n; G6 s% b* h7 A; ~5 [
使用下面代码,对内存使用了mmap函数后:
! H* q9 Y9 D$ ]+ p#include <stdio.h>7 K' A/ B' i; e4 S% Q# q( i
#include <unistd.h>
0 F6 g9 M) y/ ?' m) ]" h#include <sys/mman.h>  T( u* Z& @; K, J+ z6 j
#include <sys/types.h>7 B) F0 k) {  h$ u
#include <fcntl.h>$ |/ g) a( X7 q- r: u

# H6 N8 v1 E  e#define SHAER_RAM_BASE_ADDR    (0x80000000)
* P& s* H0 G7 \0 A. K" r#define SHAER_RAM_SIZE         (0x20000)   ! m  S% F" Q: f6 o( M2 o; L" o
( y; D0 Z3 w# X# ^
typedef struct* T$ X( Q5 x4 k; c5 s4 n' _
{; N$ \) E# J$ L
        unsigned int a;
" _) ~1 K' ~% L! S/ j        unsigned int b;
( z  c+ G/ ]' C+ }) n& g        unsigned int packet_cout;- ~) ^8 e- ]( s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ H$ [8 T9 ^) ~& d* @( u/ p! f# c! p

- \. c- c/ |& zvoid read_MSG_buffer(int *baseaddr);
7 C, t8 _) f5 Y/ s5 ^unsigned int count_copy = 0;4 l7 n8 I# x+ t1 f0 U
/ Z; t9 w+ }) \  c. s) d2 n) V
int main()
6 n( o# X: ?1 h# ?{
- I/ F' l: i+ X$ E        int fd;
3 h  A# K# `7 O$ x        int *mem = NULL;) ]3 D1 f2 n4 G

: ~3 @6 d, ]4 z9 G' j        if((fd = open("/dev/mem", O_RDWR)) <0)* d; v9 r$ Q& e
        {
# w( g3 j% w- I9 A& b) c* A                perror("open error");, P% m0 P9 \' [5 R8 E  j6 H4 g/ P- p
                return -1;
# d! B# C+ C" W: e        }8 N( n, @7 C* I. Z( t0 z- e
        
7 v7 e: r$ l! P8 c3 k. R        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* S0 D( z3 t8 w+ N- ~
0 L! J: u6 R1 j- X% Y' V
        while(1)
- H' Q! A5 N$ L# W9 b% c/ c        {: Y8 t! Q" {# d# l, ^3 K! b: o
                read_MSG_buffer(mem);4 T, ~( s7 q5 U1 `4 u* p
        }               
# P0 h- l0 T  ?* y3 Q# F}
0 o. s" q2 W5 Y8 q5 E) S% t5 \5 O4 s5 F; m# o- d( N
void read_MSG_buffer(int *baseaddr)
. L  ^6 s8 ^7 g0 ]{
5 t4 N; \& s/ d4 X7 E: b        pRX_MSG_PROTOCOL pshreRAM = NULL;  W; u+ S0 ~" j8 e. w

' x5 @3 m( R, Y, F2 i        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;  r' |! L# S  }3 E( y% q# y
% h# A& s( l+ I" I! Z
        if(pshreRAM->packet_cout != count_copy)  p2 Q+ Z" I1 {
        {
* a: s; v! N6 b; @( |                printf("a is %d\n", pshreRAM->a);. ~2 X9 [$ b1 p2 [; O
                printf("b is %d\n", pshreRAM->b);
# G* T. v  {) q# g2 `- o  g                printf("count is %d\n", pshreRAM->packet_cout);/ [" {' w/ e; t
                count_copy = pshreRAM->packet_cout;
: l1 S. t9 K% Q0 e- E  V8 V        }% O+ N  \8 _2 |
        else, \  l1 U7 f8 t, t% ^
        {
, g2 O1 T/ u( ^- Q# w" O                printf("No effective message!\n");
: r, d+ H; Y5 ]2 r  [; m+ ^1 ^2 T# W        }5 b4 J2 B* ]. P8 K
}% \1 Q1 Z- }; X& W

& ~% W7 _7 h3 q; I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* O/ g3 B4 G/ I6 v4 t+ w/ Y
. t% M2 m) M" J3 X# R% [/ S1 m

- o( M2 m- f! {! U6 i- e/ |- d9 B; Y7 P  Y0 N

& S5 _# Y+ w! I8 [7 Y& W4 t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-2 12:15 , Processed in 0.037759 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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