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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 c4 ~4 t" @# W
( K/ I. C- E1 ~3 [9 T( `9 WOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) }( }2 S2 Y6 _* g5 R& S( J
#include <unistd.h>/ O: h6 |3 U: b/ v" D
#include <sys/mman.h>" i3 w% g/ j  V. L0 L5 F
#include <sys/types.h>' w0 J8 H0 X) A) c7 h2 a
#include <fcntl.h>
+ C+ L' w2 |/ a* R* }9 o4 t' _) L8 m2 C; h5 l" V- P$ t1 Y
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
+ J0 {4 {* i( v- Z9 U2 U( Z# o$ ]' s2 f" D+ O8 ^: S6 d' u
typedef struct. A9 o7 L& G, O. \& x
{
/ H, P0 |; y- ^7 \- H( J( o7 L        unsigned int a;3 U- q; r! [5 A& s0 x5 |8 c$ I1 W8 b
        unsigned int b;
5 {8 A3 Q- b* N( s        unsigned int packet_cout;
- N. W. d' }1 c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) T4 |+ X% m$ d* z6 j1 I
7 I0 @& R. d9 }* z: j0 ^- I+ k, N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 k- S3 D, S# E. runsigned int count_copy = 0;
- O- M0 ]3 |% `( ^/ I9 A. w) `. ?6 _  D# t0 n; ~5 r

3 G/ @* U8 ]: ]+ ?/ Bint main()4 |! P+ M; f- A/ ?
{
! ~# m5 o/ H& C- G8 t0 D7 C% v  W/ F        pRX_MSG_PROTOCOL pshreRAM = NULL;
' \2 i6 h9 F/ K6 c4 K        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 Z9 [. G9 b: K9 q% A5 a9 ?( M' A3 ^$ u
        while(1)% |4 ?  ~6 I* }  ^; W
        {
" A& S, k) h. Y: w$ H, K& t" i                read_MSG_buffer(pshreRAM);
( W. A  Z% {# s; n7 s3 O        }                7 g) s  T+ h/ _
}  m# K3 i& ?  t! {. H

; v$ C0 H+ r3 r& t0 jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ Q+ J% p* Z2 p( Y* u. c" M
{" l" ?# t  l* ?  s
        RX_MSG_PROTOCOL buf;
6 q- ~8 {- A6 S- u" h! w0 a        / A- U# C1 x* H; e, X" q) g
        buf.a = pshreRAM->a;
4 D" G$ l3 E+ l8 I6 D6 I- x/ l) C        buf.b = pshreRAM->b;
# l. D/ v  q. \% n" x        buf.packet_cout = pshreRAM->packet_cout;+ Z: F1 r. n/ C: @5 V) X: `: O
        
8 X4 U$ u4 g. R. |" L        if(buf.packet_cout != count_copy)
" T) d. {% b: n' a$ M+ |' R        {7 ^/ e! d& Z9 u+ h9 _& H
                printf("a is %d\n", buf.a);6 i6 n1 j5 I1 j$ R& I
                printf("b is %d\n", buf.b);
  l0 M3 A2 M+ K( G0 [                printf("count is %d\n", buf.packet_cout);) d0 j8 B5 z% A% R9 H$ s# F1 U
                count_copy = buf.packet_cout;
4 ^7 q. p1 Q2 F; G7 o' ~        }+ n$ Q! U3 ]0 X( ~6 y+ V4 V
        else  l& T* a7 R- S) E8 ~! @
        {% m  I" J0 q5 {; o, q
                printf("No effective message!");
) @- }4 V" b3 _  [        }% d  ^+ m0 n% N
}' j1 D6 s8 J% j& X" }- U$ c

# o& C4 D8 `/ q$ [1 o% E8 [# y1 h+ Q1 |8 [
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" C7 b3 K. ^2 E% ]) `* w# W
使用下面代码,对内存使用了mmap函数后:
" K" y1 w/ Y3 [' ~( o% e/ R#include <stdio.h>8 e$ K! P+ `8 t6 h
#include <unistd.h>
) T5 f5 j( B: b: o( W% f6 S#include <sys/mman.h>/ |% X$ h6 j% G
#include <sys/types.h>
& K3 m" }. R0 E3 o#include <fcntl.h>* F! B- L2 U4 I* L( O  ~: r

" D0 }% l! @* W9 B( A# G. l#define SHAER_RAM_BASE_ADDR    (0x80000000)# L6 p( R( G9 |' l4 n1 K! \
#define SHAER_RAM_SIZE         (0x20000)   5 S! s3 m) a8 ?: x2 \6 }) `

9 [- l" S* b& m  f/ }typedef struct
) ?& {4 P, z3 |1 Y8 i{; v  k. N1 Z3 t" Y
        unsigned int a;
8 X2 y- u( E" A6 e        unsigned int b;
+ R& j- q7 z( n8 J! y3 v        unsigned int packet_cout;
2 `) F! S( T& T- t+ Y/ ^. q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 M% y2 J  @4 }; ^2 M+ A% v. M
* C$ X* }. r1 D8 O/ F& C  U- _void read_MSG_buffer(int *baseaddr);
$ ~: I8 ~& Q$ E6 E: ^+ cunsigned int count_copy = 0;' J1 g' E7 r' V

0 ?: F1 W, j$ n, K, U, Y! P4 Lint main()7 J' [% g; a: n% c" ?: R5 T5 U) Z* _2 \
{# ^0 j0 ^2 G) q2 ^4 @. s
        int fd;( J. t; u+ M; _8 F( ]
        int *mem = NULL;% t2 Z( w/ c7 R! q$ [) }! K( B

: Y5 W1 J0 p' p, V        if((fd = open("/dev/mem", O_RDWR)) <0)
1 P0 G  t4 o5 ~" \        {" I. _. @' b) E
                perror("open error");
; _( h/ S0 y! G" H$ [' t4 b                return -1;" t  P2 f' D$ P: C' K% p; O
        }
; C6 G* R* \8 _' m        
4 B1 ^6 M/ w. d' d9 I: g. w        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 ~. M. ^) m6 \3 Q4 r- q
) C9 }) Y$ C+ H4 p
        while(1)) E- E6 a- ~* S0 V% @: [
        {
' O2 }! L- {7 [5 L" r1 `9 L& J& B                read_MSG_buffer(mem);
& S% ^- ?- ?4 j! ?! q7 D9 _        }                " c; q) `  p+ q5 T; W+ U% j, d% l8 Q
}
: J0 a* T" w5 I4 N1 H, N. ]# b+ X) z" J9 m; k' Q
void read_MSG_buffer(int *baseaddr)3 X  j' e7 i, e8 m# W
{
4 b6 p" F) j& `7 v) J8 ?        pRX_MSG_PROTOCOL pshreRAM = NULL;
) b: x6 ?5 n/ M: L) a+ E5 `" {+ ]4 e: h
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 @) w" S& s# D- E* A
4 e! q) [: n$ [3 `, E% X        if(pshreRAM->packet_cout != count_copy)3 H8 ^  ]: K/ m( Z& Q7 H7 K6 Q
        {
1 w7 Y% A& k; I$ @" M' f                printf("a is %d\n", pshreRAM->a);
' x0 q- y, p# X2 c                printf("b is %d\n", pshreRAM->b);" X1 ?5 H( F5 R8 K  Y/ J- p
                printf("count is %d\n", pshreRAM->packet_cout);7 g' a- ?- h3 t8 G
                count_copy = pshreRAM->packet_cout;1 n  O" w6 w$ ]% @
        }7 h) P9 u: X5 [  a0 @; C
        else
# U, v! n2 r  @$ R2 H        {
- s: r; i+ W9 Q' ^                printf("No effective message!\n");
0 v, y- z2 x5 i+ r' o  c8 U        }
* @& c/ C) X5 Y$ m}, ]1 ~8 b- I$ `3 u+ F  Q% G

1 Y0 l( X% G% K; r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 G6 g# @, ~4 O/ [7 R$ _3 m: L* v

* n1 e% g: o) x
' ^* c4 m. E* G+ K* S% `2 ?' Y
+ P. e$ Q( V" n* J( D% R! [' f6 b2 l# G- O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-5 00:32 , Processed in 0.040251 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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