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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 }& O( ^' }0 o* `. f. `
% m/ K8 z) H7 a5 T% W/ E0 z6 Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
  Z4 c8 g1 T+ O#include <unistd.h>
- w  p; e% Q; Q# J; J' p3 n#include <sys/mman.h>! I" W* p- u9 r/ j* J
#include <sys/types.h>
7 X  `, U& U! T6 V" ^#include <fcntl.h>
- K2 x! x' R( x' c& ^+ i* W( j: i2 J4 g: j3 O) s8 @# W: U6 A
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 U% \2 A, O! p
; l* d% R0 k2 @% h; J2 U/ Ktypedef struct
, _. t  d& Y0 N7 L: u1 C( a# ?; b{. K' L7 m3 R) r+ I$ J5 Y/ H
        unsigned int a;9 G* w- m( o+ \
        unsigned int b;
) W3 R# j" X+ d. w        unsigned int packet_cout;
2 ?% f! z! Q$ @* X# W' n- m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, K1 p% L: ~' J* J1 ^5 l9 a) p4 W! ^- Q+ u1 m% Q7 U3 w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. m0 @/ X, U9 o3 u7 y+ F: \$ d5 [
unsigned int count_copy = 0;7 t+ Q/ Y- q& F% E" _
. ~- a9 U& I) `5 `
/ |8 e+ K; d2 Q: T
int main()
4 V4 \# p; q* G: Z2 Y" e{$ N" Z* [2 B5 \9 t  q
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  P. n. |3 \" C( S0 w  Y. x        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 J+ h5 r( [+ U# T- ?3 y' z

+ R8 S+ z' G8 r$ d" W+ F        while(1)& ]4 E/ m; A9 \3 T: i7 G0 j8 O) g
        {
8 m. H+ A. B( q, b8 }5 X# u                read_MSG_buffer(pshreRAM);
# {$ c5 p4 d7 `) o( V        }                6 B0 K8 G8 I/ {- P( l
}
% {$ q1 m9 w5 @" ]! c/ |# v1 k0 m" e+ O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 U- \- a4 k7 _# Y9 v, I/ b. i
{
! X- @- h3 v% @" g. R        RX_MSG_PROTOCOL buf;' F" e5 ~- y: E8 v7 g
        ! ?& I4 m$ r6 ^5 z0 Y% k1 R/ G
        buf.a = pshreRAM->a;2 K' l1 Q3 @9 b- {2 N- N1 N, e
        buf.b = pshreRAM->b;
- V  A$ W! F9 f% c- W5 Y( T        buf.packet_cout = pshreRAM->packet_cout;: w% t) t# O% W+ }0 |
        6 u8 ?% n( `) z- g! a  I( ^) S
        if(buf.packet_cout != count_copy), w2 q: R- d$ ^; b
        {
6 X4 M6 H5 S; K6 l2 [  i9 c                printf("a is %d\n", buf.a);
- a, [* J! u/ H/ H# ^& D                printf("b is %d\n", buf.b);
- Y: c6 u& P7 O                printf("count is %d\n", buf.packet_cout);
# W( ]8 N/ a+ K% p( ~2 u                count_copy = buf.packet_cout;
: ?7 L" ]% V0 h        }
6 e$ c" d) m6 I& [/ c# ]        else
: B0 p3 M7 ]$ L' m0 w        {. W& P; x" ]' K- D; b+ T  i6 e
                printf("No effective message!");: a  ?5 c+ V* f) _
        }
' N# i) ]- M. [5 A+ [}1 C$ C9 h. B; t8 u5 ]# p
6 [3 K/ Q1 k( ]3 ]
- D0 A. [1 b  {) F: C
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 N& A4 C! A! Y0 b. r8 n( K使用下面代码,对内存使用了mmap函数后:0 J6 k7 V7 j  |" x
#include <stdio.h># |5 x  v! S8 |' r: P
#include <unistd.h>3 Z/ N. T: l6 @3 i
#include <sys/mman.h>& }8 T7 ?$ j4 Y
#include <sys/types.h>( [) g, {/ `3 n( W/ t( w( M6 B/ K# |
#include <fcntl.h>
' z0 b, |  s: Q9 j1 H
! @# E# i8 p" K* J5 g#define SHAER_RAM_BASE_ADDR    (0x80000000). ~9 x3 y- V4 E, v1 W
#define SHAER_RAM_SIZE         (0x20000)   3 ?$ {% t# _  O0 E( @3 x% _7 H8 ?
7 F- B/ K& P& c
typedef struct" L% S7 Y. E& c. H! t; k: C' a
{' W, T) L3 `  ?% {( G. B: g
        unsigned int a;
) C) J1 J: a, q' G9 [- Z        unsigned int b;9 ?( Y- Z$ C( P) Y" K( i
        unsigned int packet_cout;
8 t1 E7 k+ b4 t2 X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& V6 O# Y2 h! `' u4 L1 ~
; k) \  q! J) h/ C2 N" ~void read_MSG_buffer(int *baseaddr);
( W0 s$ c" S7 k& X/ b9 bunsigned int count_copy = 0;
9 J: K. |6 C  |2 c' J
3 z6 t! d+ S  {# [2 N$ e& Vint main()- n( _1 n% I6 ~7 F
{
2 H. Z3 k- C" ~  m6 \) u! V        int fd;
8 }, a1 j3 b. K' R: A        int *mem = NULL;% d/ @- H- U7 q* T7 i
9 \9 G, O" X8 Q; a
        if((fd = open("/dev/mem", O_RDWR)) <0)! `1 Z' t% `/ {+ B* F3 i7 [; ~
        {
8 ?% [" B* Q) T6 S- @" D0 C                perror("open error");
8 S0 ?0 [6 [$ U& y- j" t& ]3 Y                return -1;
5 Q6 _; R5 q; n9 c        }
+ `, Q5 F- F9 W2 s" R7 Y/ _        1 b4 N1 a6 `, c3 ?
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 f/ A4 P% i2 p8 @! }0 y( \% Z

. W, i5 ^% ~1 i; v% l# D! ]0 Z' u& W+ m        while(1)! M9 X" s/ v! B8 s; z0 f6 r1 F
        {; O0 ~) e" }7 y- Q3 P
                read_MSG_buffer(mem);
5 I& V: A3 O3 y( \        }               
: K% E  g5 n2 b2 \5 f}
, r% O8 O3 {4 T( u" t' W! r1 k1 D6 h$ C9 I$ b4 k* h3 R1 e
void read_MSG_buffer(int *baseaddr)
" F# {% z8 O& O3 [! w{
7 I1 U' m6 H1 G. g( T        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 e+ J3 ~! t; g. e
7 Q4 G$ G  e7 o4 Z6 X0 n% I" T        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! T4 P6 k2 x2 W" q% B; t
: `% ?- W  M, Q
        if(pshreRAM->packet_cout != count_copy)
; Z! ~" v) V" u& A% v" x3 A( j        {
+ Z" k; k2 Z  @% C# e8 u9 h6 f  m                printf("a is %d\n", pshreRAM->a);0 K$ ]9 d4 r- W* N8 h! N# l6 W
                printf("b is %d\n", pshreRAM->b);
) P5 o5 w% |. Y4 ?                printf("count is %d\n", pshreRAM->packet_cout);
! W; {$ M; G" n" V. b3 F2 T9 H                count_copy = pshreRAM->packet_cout;, w, \7 S6 N( d% J" I. ^
        }
+ _5 f% b+ X! c: g* W2 `6 Y) T        else8 H' @4 Y. f) C( Y2 y4 e1 |" Y, v  J
        {
$ S% [0 P$ R0 U3 O1 N                printf("No effective message!\n");3 m  s, ~4 ^! o/ d
        }
1 y  ^0 M. ~" ]9 i}
/ ?) H! g# n, Z% R+ @7 R# m1 `: `2 [; F: `- [8 H; r
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& S& I+ ^5 g# g- ^% M
8 e. c+ X* P7 V8 ]
( u/ |! }( m; k3 t, E
/ \1 H/ j" d7 p$ P. U+ ?$ B
$ |: L0 l! K! @$ F4 r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-6 14:04 , Processed in 0.039257 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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