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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& W8 I; h+ B+ f. t( I' v
' Y2 D: ~6 |$ r9 }9 L5 P: ~$ cOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ F& K  g- B* B- B- v1 D# h#include <unistd.h>0 S. i  l: V, {# X( }
#include <sys/mman.h>7 ~3 S& h  j8 ~6 _) b4 I
#include <sys/types.h>$ P# S6 M: Z8 }7 j0 }/ L9 `3 F
#include <fcntl.h>
2 P8 D8 H! \" a/ f4 x& W5 }
# O9 N) l% g$ j#define SHAER_RAM_BASE_ADDR    (0x80000000)   
: ~4 K( {2 `) ?% B
$ h( V1 y6 N9 i/ p9 g3 Ztypedef struct* q# q2 f( t3 A# H+ e
{9 n) ]# Q/ q: A7 Q9 f' g
        unsigned int a;: _2 F5 P* H$ {. R
        unsigned int b;; l# L+ c# K* d" K
        unsigned int packet_cout;
6 p4 m* Y8 j4 a" ]( P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- M1 o/ p6 Y  ?" o* r  _, O, N7 A
8 U: q7 l# T% A9 P2 bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; {! U9 G# t9 H: f  l
unsigned int count_copy = 0;
5 Q' E* z5 }! P0 `: }" Z5 p( p4 ^  W) T9 @+ X, B0 @
9 a& I' r% k+ j0 R* o7 z" ^5 R9 T
int main()
6 k6 I  D( g8 @! m{0 {. e; ^4 }5 r1 N
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 k4 H1 h+ V- B% f7 j4 l1 H: M9 Z        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, C6 @1 c3 H) \+ H
1 n, j  f  f* w- `: |6 t        while(1)( p) n* }8 u  Q/ l" K
        {
- \/ o$ D9 [  H                read_MSG_buffer(pshreRAM);) ?0 k# h% Z* W
        }               
! L$ b+ b% ^/ i7 d  f. }6 ]}
3 X" F+ `5 R" G. b. c4 ^" H" x$ u6 t4 m$ L2 @! v2 c5 u; d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 b8 F$ `1 u1 A% m
{. v1 d; ^9 `% C5 P8 ?
        RX_MSG_PROTOCOL buf;6 Y9 t7 f8 j# X- V. W$ P1 G8 Z
        
& c4 |% i$ a+ n( X- a/ V8 f        buf.a = pshreRAM->a;
$ `8 @7 z4 T- C: o# T: e        buf.b = pshreRAM->b;
8 j# j# k5 a- Y' O6 {: i) o- Y& h        buf.packet_cout = pshreRAM->packet_cout;
+ i, g+ ?7 K% i! i; D4 W5 @        5 m! d' ?. C' }
        if(buf.packet_cout != count_copy)
. Q, B  @, G/ P% J6 k2 O        {% v  {( ~8 g# n
                printf("a is %d\n", buf.a);
9 N5 Y6 \5 m" [" ^' C                printf("b is %d\n", buf.b);1 z  @3 R+ [, g1 D5 c/ q8 x/ q5 a
                printf("count is %d\n", buf.packet_cout);
: M% l+ K) Z! R: o, S* z  y) p, V                count_copy = buf.packet_cout;; x' I: @$ `+ {" a$ d+ L7 j* T
        }, M* N/ E$ t- f8 }. l8 ~
        else
; G# p9 w/ |1 Q! ]4 s        {9 f2 e$ h; M7 q
                printf("No effective message!");3 J& K( A' R# B5 _3 Z: y3 w- }
        }: C1 i1 p% d& m9 l
}, Z4 o" C) U3 l& u9 o
  y1 ^9 M2 ?% S& ^0 \
( t& p# Z& k/ ~1 w
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 V4 M4 r' H/ Y( S" v( y使用下面代码,对内存使用了mmap函数后:1 O9 t1 Z$ m0 y
#include <stdio.h>
: J  ^1 D) h2 U#include <unistd.h>7 m! T5 y% ?, H# U
#include <sys/mman.h>
! B2 F# {) d1 E& O" c$ ]7 ]#include <sys/types.h>2 K/ g+ c) C" ~5 t2 n0 k" ]& f3 N9 \
#include <fcntl.h>8 o! L7 F2 z* k2 M, \3 \: c' B+ V. ^

8 C" A1 \7 N3 ^1 C& J! [#define SHAER_RAM_BASE_ADDR    (0x80000000)3 @1 A# c! q+ P0 C# P/ `
#define SHAER_RAM_SIZE         (0x20000)   ; X, f7 y8 w3 z! b

) i8 Q! d  ]. _2 N# O- ttypedef struct* F4 T$ [5 Q' G/ _3 p: v$ A
{
( k  \2 ?$ X( Q" I' O        unsigned int a;% |3 |0 Z1 r. F3 R' D6 o
        unsigned int b;5 u4 R/ u: H6 t) Z# n& n
        unsigned int packet_cout;3 _# v5 w$ N6 q2 x( {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 @: U$ ^7 Y9 \" g( h0 ]8 k. k# n7 |' ?4 A( ]7 ~
void read_MSG_buffer(int *baseaddr);3 ?8 Q, j+ B/ t7 C& M
unsigned int count_copy = 0;' g, S# t. [# I
; ^8 `) ~/ }4 O* |
int main()
4 I. y# @. Q+ C5 r& e3 Z{
& R7 Z5 I0 f, O3 m7 t7 L; W        int fd;! b* |- _" \7 w  g/ d( h/ z) z
        int *mem = NULL;
4 k5 n/ y, m* z9 U
7 Z5 @2 q; l/ Y/ n        if((fd = open("/dev/mem", O_RDWR)) <0)1 ?, j+ n- ^: C& R, f
        {) Y) i# k$ G% Z# E: n0 ?, V
                perror("open error");
0 C. v3 s' x$ ?4 Z8 x0 g                return -1;
- N% n0 v0 r& m5 b0 V1 _4 {) F3 A- ]4 f        }
0 Q, y6 ~* a# c: y        
0 u8 R$ V& k/ A% U- o1 G        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 Z, m: J' U( U6 B1 A( f2 U( h: ^
7 _! O! a8 R) i" O
        while(1)8 |5 O; \5 U! ]: V" Y
        {
. b6 p0 E) e' |* P  a+ a6 @                read_MSG_buffer(mem);2 ]) r2 V. r' Y: o# f
        }               
  R/ n9 W* V! M0 u}9 x) F" K! u7 E, t- E* C, t1 X- T0 l
! S: H' u+ O. Z& ~/ x0 u  V+ j
void read_MSG_buffer(int *baseaddr), g# F" k5 N! h, @% p! o
{
9 F4 y" p1 [1 ]2 i( P        pRX_MSG_PROTOCOL pshreRAM = NULL;/ [- P& [- R2 W* H) u
1 x- d# z; _3 ?
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;3 I; I' @! f/ [& ?
0 L1 v/ d7 ~4 }) g# m
        if(pshreRAM->packet_cout != count_copy)% o4 D/ L+ y, f  I& p( O( c* I7 G
        {
: P( [* U" Q0 A( Q2 ?                printf("a is %d\n", pshreRAM->a);
) w. e: p2 g; H9 J8 c6 R                printf("b is %d\n", pshreRAM->b);. _/ z' B- D) Y  i- {
                printf("count is %d\n", pshreRAM->packet_cout);& Z# C' I- W* E$ A4 w$ ~7 j
                count_copy = pshreRAM->packet_cout;& X: d* v$ ^% ]  g8 R
        }
6 X  {3 \* `  V        else
2 r0 {- h, V( m' l        {
( [$ o1 H5 [& K7 Q0 Z# i                printf("No effective message!\n");
. Q4 K9 t+ Q3 v& C4 G% V6 i/ F+ A        }: |, F, y5 o/ A
}
; z6 w1 W) u1 t: ^: l! M
1 b( @; A$ n' a1 G没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" V& i' x! g7 L4 C9 L5 O& S! e1 V0 r* h/ q4 {+ h% H/ Y

; _$ `8 w) N8 R4 ^
2 c8 K; s. O8 `* e$ m! N5 O9 H: `# G
5 Q. g3 c) }  D, w( ?" l8 u' O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-27 14:08 , Processed in 0.039875 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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