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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- g. r8 Q) D" l5 [
" r( g) F" D$ t- o8 ^9 J5 aOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>  a4 @! ]9 R* b- V7 O: L
#include <unistd.h>
5 x2 F4 M$ I: [: Q1 Y: v6 s#include <sys/mman.h>
$ {7 A1 N8 U1 B" a% K* K7 d#include <sys/types.h>/ R+ F6 F% p7 E* e
#include <fcntl.h>+ g# d- W4 l$ S: X1 Q

: \$ N) i4 {+ {5 w" m" q' N/ A- u#define SHAER_RAM_BASE_ADDR    (0x80000000)   , o( A* ?4 Z" E9 b
1 D' [0 q1 i+ e7 y) C4 I
typedef struct
, c' O; K! n% Y* A  B{
4 o; S: O6 Z6 l! a: |- c4 v        unsigned int a;
5 F9 `- o9 N7 U* A; _8 z        unsigned int b;
* h! b; G  I, ]# m+ M; ?        unsigned int packet_cout;! y3 y3 O" L  e- s! h9 [3 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 I! h3 @5 u% Y( y) A4 H7 D: d1 Q5 k) y" H/ [/ r* ^2 M+ a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 w/ J& {8 o9 n9 k& sunsigned int count_copy = 0;# v7 l  ^$ k6 j! R% _

& X; E% }4 K9 @; t+ W8 G% \8 K7 j; i* y/ a. R) T* b4 ]
int main()& J: I" N7 m. O! A1 \7 V8 r
{% ~: _: a& S3 N$ N
        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 F. I# s# E3 p4 Y" ~' d        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# b3 H# u% A' y4 U4 t4 l( f0 b' ]1 e4 k& _, `% C
        while(1)2 e1 A6 T0 x7 q
        {
: ~& E$ Y) f$ e! g                read_MSG_buffer(pshreRAM);
0 M8 Y; z! g6 }! J& W        }               
2 l% Y: K  [. O/ V% z" r}
2 P- e, ~: B+ e4 {/ P) l7 X6 e
( p* S) z+ Q; R( tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ H# b6 q8 b% o3 E1 p9 X$ a+ T
{) C- v2 h, B. {$ f! ~2 ~, x* A$ g! ]
        RX_MSG_PROTOCOL buf;
4 {# ]1 G; P( e' R- p1 F        
+ C5 O, \7 X5 a- X) m        buf.a = pshreRAM->a;
+ p. O; O) h% u6 B# o. F        buf.b = pshreRAM->b;
* ~( _# o5 }' t) f- L- H        buf.packet_cout = pshreRAM->packet_cout;
: y7 u& o) o4 j8 ^. L* Y) C$ E/ Z        ! o- O, B1 B: q( e1 p8 T% e4 [2 O) [( y
        if(buf.packet_cout != count_copy)
6 r$ [: g/ I: b0 A# g1 d        {) X+ M7 R1 Z# ~" F
                printf("a is %d\n", buf.a);
+ U; M- k6 e8 X$ h& [, m/ v% l                printf("b is %d\n", buf.b);1 a  C) |7 [  w0 L3 e+ E& [
                printf("count is %d\n", buf.packet_cout);; A- j) i' s  S2 f- Z5 a6 g
                count_copy = buf.packet_cout;
% D! f. U9 r3 f, [# s0 x6 J        }6 \4 y1 W3 T0 y) B( l% V+ n+ q) I9 H9 M
        else, h) I  w8 Q4 X4 O
        {
8 v9 J, }) u& e& W                printf("No effective message!");
, N6 j" O" r0 ?8 h        }
9 E0 g/ c( X4 b0 L! |- T  D& ], w/ H}. M6 n& W5 O0 a+ k# o( R

" k7 w/ P" [9 u; |2 k. c- J4 [" ]4 Q! B# p. s; D8 h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 |8 ~4 f' D. p  s8 k4 T  U- ^, V
使用下面代码,对内存使用了mmap函数后:
: q" O) o* E) G) S- O+ N#include <stdio.h>* o# Y3 P' p, U/ D
#include <unistd.h>
$ b/ O* @, M" ^, f, Y; v$ J#include <sys/mman.h>+ N) Y$ v: q) w* t
#include <sys/types.h>& L" p  d: i$ @2 N6 ]9 v( L4 `5 ~& [# X
#include <fcntl.h>, N/ ?: \+ a# ?$ n4 v5 P
3 E& k, m- E/ {* W; M+ G# k7 Z. S
#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 t$ f1 d5 a/ _8 c7 X0 x% |8 ~#define SHAER_RAM_SIZE         (0x20000)   9 Y6 R6 |& R2 z* T6 e! U5 d9 [

6 k( W( U# [5 `, V# wtypedef struct
3 N* k# U- f7 x6 J& D' g5 ]* A4 s5 ]{7 K7 l  a# z$ ~0 A
        unsigned int a;
1 x  y$ k7 K- u$ j, h$ f7 f        unsigned int b;& k6 V  r/ S/ |, ?1 S! f" Z# ~
        unsigned int packet_cout;
* f' d6 O$ [6 J  v0 Z/ R2 g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ r$ s% F( X8 ^' J7 q- x. p3 l
: A/ k+ F. p0 a" P7 ~, Mvoid read_MSG_buffer(int *baseaddr);
: K4 C5 u3 Y* u* K! m: wunsigned int count_copy = 0;
. K1 O8 I' Q8 Z+ {, V: K! m+ u& I1 {! H- e( Q- T# l2 C' e, Z
int main()0 ^3 L) O( ^0 A
{
# `* m/ X  {. [& D! ?        int fd;
1 x, U, B6 H8 h$ }- e7 ?+ ^, J6 d        int *mem = NULL;8 X2 k2 E7 q" K

/ x( j' \2 ~2 y: d$ Y3 W8 i1 f        if((fd = open("/dev/mem", O_RDWR)) <0)
. s( b. U$ J9 S, e4 A        {( f% h' p- E7 j$ J, k
                perror("open error");  T; W# e. Q! O/ e5 ]% ^: u
                return -1;
" B! X* ^- T) F        }
2 e7 f# g! U7 h# {, l  O- N        
: l& W7 f# a- ^+ P1 t) N/ i* \        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 ?- p& ~4 w9 B" O' X% @
' P: p4 O* B, V- d
        while(1)
" b) b  E8 ~) X, Q        {; t! w" J  n+ v3 [
                read_MSG_buffer(mem);
! @1 k7 w: x3 ]4 c% c: g        }               
- W+ u4 a* K* r% L- G}0 V3 z! w" g) V

- u2 l) R& U- E6 f4 q* Pvoid read_MSG_buffer(int *baseaddr)% }) r4 o  ?5 h2 n
{
0 Z- c7 l0 R3 n; _7 S0 S7 C2 u        pRX_MSG_PROTOCOL pshreRAM = NULL;4 M) o) p( Y: q0 m% t: F
5 O' G4 m5 ^" f: {
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 ?3 @/ B8 L. X4 x
; I& Q  ~, W+ X- }! ^7 A
        if(pshreRAM->packet_cout != count_copy)0 A8 m8 j; G* x& t7 O. p$ J
        {! o" }, m) v+ R/ c2 B
                printf("a is %d\n", pshreRAM->a);
; z4 T8 N$ U4 q: Q. G- O. ?                printf("b is %d\n", pshreRAM->b);! f7 X3 y& W* n( W4 V' ^: Z  Y
                printf("count is %d\n", pshreRAM->packet_cout);7 Q, V. X0 \# w: @4 r& x
                count_copy = pshreRAM->packet_cout;  |6 ]3 J0 L' A* f
        }% ^, H: t+ [# b
        else
+ f. V9 l/ O: v        {: V0 H) Y* @1 b9 k
                printf("No effective message!\n");( J2 w! p5 \- C. o' |7 Y8 W
        }
# o6 i* l6 b" F2 z! [- }/ i}
  O( [; r5 h$ G& s/ n( C) _  h. H1 {1 x" o6 N$ }' L, `# O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???+ C& n, I# f/ {$ r9 U8 R+ w

6 l: ]% o5 \3 a8 g+ g. O
& K$ o+ F2 K8 T
! y$ B) Z9 e% ^4 @; j3 C, v2 J" P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-13 13:04 , Processed in 0.041078 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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