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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 L1 {% G. i# K0 U

3 h- C" p- J8 R5 p4 `. WOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 S9 F) h7 v, Y$ o
#include <unistd.h>) c4 c- {% \4 D3 w+ }, M% a
#include <sys/mman.h>
# K' Q# `# i+ ^8 j7 W5 @1 g- g#include <sys/types.h>4 \9 W( V% N( ^
#include <fcntl.h>
4 ]3 o5 Q& {' |6 Y) g1 E9 L* {) Z* |, Y, j* l4 {
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
2 A* t& n7 q5 O5 p! T* X5 m% \
+ R$ B# K" m* c+ X: c. Htypedef struct
( U: i# f: R  M6 ]{( h. k, Q! c& {+ ~+ V) g
        unsigned int a;
  O: ]% q) o! E4 d2 z, ]        unsigned int b;
2 F6 P  X( t! n' V$ `        unsigned int packet_cout;$ m! _% `; p, A' ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 |. k, [' S! F' z

, c' Y% E5 C; m- `7 l& u: |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 E* V# N7 T6 H/ K& S, L* m/ W7 F; M
unsigned int count_copy = 0;
8 B% P  q3 q3 o: J3 ~6 f8 q; z' x, Q& t
5 ?& K$ G4 P+ g2 K9 i' f
int main()( ]- {6 N% t) F2 g; i
{
  M7 Q' P! v- e$ m& M2 x+ |        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 y; m+ c) e) r0 c. S* y        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;& C+ }! s. J1 ~3 h4 i4 h
' }! |6 t0 a2 j4 _) b- `, m3 q7 q
        while(1)
6 o# M% a0 I$ s6 Y        {
) X4 I' C2 `1 i6 g) h/ B: c' x% e                read_MSG_buffer(pshreRAM);
) h( w4 J: F4 N3 f) V8 h' P/ N        }                6 f; s9 q( F8 ^
}: V- a3 H5 {& J5 [

/ ~) B- d  Q3 J. _1 n2 h7 bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); \, w9 W' K5 L) T; R, H
{
; l- {3 k+ F" `" D8 ^        RX_MSG_PROTOCOL buf;
) l' }, z* H5 @3 k1 y0 Y6 h2 a        
2 k* k+ b& ?* s0 A        buf.a = pshreRAM->a;
1 |* T: c- Z. w# z' a( ^9 u        buf.b = pshreRAM->b;- j, J5 X" l! @1 Z5 }% |. W8 W, e
        buf.packet_cout = pshreRAM->packet_cout;) _& m6 }  i# G( a+ U
        ' p, {$ Q3 d/ S- f
        if(buf.packet_cout != count_copy)0 g7 n) m9 z) w! G
        {# ]+ U, K' P+ r6 u
                printf("a is %d\n", buf.a);
# z8 e, {& L* ~) ]+ ~, d, n4 c                printf("b is %d\n", buf.b);  J# O1 i' g. d8 B8 \
                printf("count is %d\n", buf.packet_cout);" \# j6 n3 Q( x  \- |  {
                count_copy = buf.packet_cout;+ e+ e% Q( h' \: C4 I
        }
( j9 r/ s4 D7 o0 R& N        else
8 n( T4 j/ s1 o; b7 T' O  }2 l5 c        {8 k0 i# B8 r5 R; _( ^4 p, S7 g1 ?; J
                printf("No effective message!");+ Y/ k5 z* e: m$ d$ D9 \
        }5 [; }# \4 C% R$ y
}- d- |( E- l1 P

' N1 f" z0 g( g( x: Y' U1 _+ D# {& E: ~
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 r! w1 Z! i' {8 ?2 I4 }
使用下面代码,对内存使用了mmap函数后:$ ~! [2 e. R: I
#include <stdio.h>! S' F/ m) t* ~8 a4 p2 x2 x
#include <unistd.h>
7 D! L, D$ z$ t) q2 t# D#include <sys/mman.h>$ @3 I2 w% m& }. s" Z. o4 }$ x: P
#include <sys/types.h>& p& P/ O- J/ A5 u9 ]! r: N
#include <fcntl.h>
: {8 o# R6 ?  _. I- O- q1 |# n2 L  X4 Y9 X
#define SHAER_RAM_BASE_ADDR    (0x80000000)! `* R8 p" M. ?
#define SHAER_RAM_SIZE         (0x20000)     P( [7 _8 \; F2 |

" d' w! U* q# S; Rtypedef struct
2 [/ o- e& {' g/ B/ F{
& {7 r& w- t% g" `# B        unsigned int a;
: A) R- w  X! ^# D/ E0 R        unsigned int b;, l6 X4 Y# `. l1 ~( p  p
        unsigned int packet_cout;: {% y6 o$ U) Y% i. v( m$ s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ K) J+ |! I- t3 V, U
" r' \; E& Q) P& ~/ B
void read_MSG_buffer(int *baseaddr);- Y* k* d* E- K- G$ J% a
unsigned int count_copy = 0;
3 n) C1 W- }2 y5 c
3 b: Q' H! F" w) N) b' i/ b3 \int main()  X' N' U* `" A, f! T
{
3 |5 x/ G; }6 W0 m3 P        int fd;- b1 }5 u  X3 V7 R% H- V4 o3 o
        int *mem = NULL;
; B  `' T" y( C7 u" @2 i- X5 W4 V8 `, O. ?
        if((fd = open("/dev/mem", O_RDWR)) <0)
# e6 L9 d- L$ D        {" w/ `6 T/ v6 M7 x" J
                perror("open error");
+ b' T2 k* L" k5 S4 Z; m9 ~                return -1;4 t. K4 B( A7 a$ V! D& S
        }: |6 t, _$ I& Z
        ! p- n7 e' q2 \) S$ P
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  z& g0 X0 `9 g# O/ o/ |
4 D2 ~2 G% }9 T6 K1 D        while(1)! b2 R4 z  x1 L& R$ }7 S6 ]# `
        {
# M3 S, ~1 p" X1 b0 z                read_MSG_buffer(mem);
  i' B* ~% `/ D5 P3 W        }               
& {6 g' O+ ?! T+ e}
1 N# e9 q+ a0 G/ o' w& J" `) I
, W% \) U/ _, `/ H  s  a, lvoid read_MSG_buffer(int *baseaddr)
& X0 m& y( v1 h" J- h{9 y# b7 ], }  S/ D) [8 P
        pRX_MSG_PROTOCOL pshreRAM = NULL;
; y- R3 e! `' [; e! S% a' d1 C/ i3 q/ L3 Y, B
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 s) l2 ?% G/ o- N, d" M
7 C. c* K+ F- ?% v( _0 S- i/ X
        if(pshreRAM->packet_cout != count_copy)7 [  v; a  W! Y  I* h
        {
! M% A* x1 a+ Z                printf("a is %d\n", pshreRAM->a);- Q9 O$ v' q; U# @, I) {+ }& U
                printf("b is %d\n", pshreRAM->b);8 Y, b) |$ ^3 _
                printf("count is %d\n", pshreRAM->packet_cout);
! H7 H. z. E' e1 ?3 `                count_copy = pshreRAM->packet_cout;3 B; ?4 \7 A% L& F2 R' T
        }% y3 m! Z; d9 C. s# ?' g( f
        else% y. |6 l  T3 H# a* M
        {. T- A/ o* n. s
                printf("No effective message!\n");
% H, N& u4 }+ g7 q1 K, g        }
7 \- `& {* \5 m; {  |  M  m0 {}
# r7 m8 `% E0 _
9 a6 _; c+ B' i& U% \& J没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 [+ R+ D' T: H; n7 @
* {+ ^% \4 [6 K1 p5 x3 D% E
1 m" x3 `% Z7 n0 l; W' C" u- @

5 i( Q& f$ a2 l) J4 G( e5 V2 O1 |( x; ?7 C! j3 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-21 02:57 , Processed in 0.044219 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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