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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- y  w7 ~/ W7 |* \& p
- L: q3 W" |  t  C# S' oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& P: v7 d" W' u( D! a#include <unistd.h>, q5 z2 G1 e& n5 V1 T7 B: m
#include <sys/mman.h>
8 d6 C% f7 q" w4 R- Q#include <sys/types.h>
# ~2 g2 Y; G  }( E% u8 a8 P# r#include <fcntl.h>
, [2 h& \$ e1 ]
- u0 g7 v5 l9 ~4 k$ M( p4 j! @#define SHAER_RAM_BASE_ADDR    (0x80000000)   % z: p# n4 R7 _6 B
! |2 i& a% K# A0 o; Q1 E* P# i2 ]5 C* M
typedef struct
9 {: @- T  f% G8 a% n" X{
4 O' d( L2 ]3 y, H        unsigned int a;8 e& b2 d& Q5 ^& d2 d* U
        unsigned int b;- ]; h8 d+ l7 x4 u( a5 e# E" p
        unsigned int packet_cout;
8 F6 a) g1 |8 w( s4 i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, f: x! a7 ^$ v* y3 H; b
+ B7 P$ q# e  y- {5 z; V1 K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# W% ?3 J% i) b
unsigned int count_copy = 0;
6 G" s3 V$ Y( d- s7 B0 y7 q
/ Q' r/ |- C8 K' }: J5 y% Z4 T% ]
- G9 s' X- J" |int main()
0 J$ O" U5 B+ F0 a- v% o{
) p2 N% Z3 x$ l& m8 `: Q7 G" v        pRX_MSG_PROTOCOL pshreRAM = NULL;$ f3 C! L, c0 q
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 R+ w) ?& a$ V1 M$ Y& y) E6 L

3 t: s, r+ q# Y* ?! d4 C) T        while(1)
! S1 }: K. k9 s# L$ l& `        {; |  \2 ]* g1 o1 H; n' `
                read_MSG_buffer(pshreRAM);
" Y; h( V! f5 [1 m        }               
/ V- E7 B4 ?) I6 E. [}' i0 ?7 d4 ^0 P
) s- J9 @& F/ ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# V0 r" Z! c7 \$ e{
6 z. K  ~4 x% r* g        RX_MSG_PROTOCOL buf;/ x# X0 {, |' N5 [& R) ^; `
        
/ M6 i* F4 R/ W: f3 e- D0 e        buf.a = pshreRAM->a;
5 n, a* v1 T; C7 B2 e' t7 w        buf.b = pshreRAM->b;
: F5 v+ e' d( i6 b7 n: i        buf.packet_cout = pshreRAM->packet_cout;5 T# J! a" S; r9 b* m2 H- z
        8 Q/ n+ g3 A7 t: m0 u& V
        if(buf.packet_cout != count_copy)
% W) P2 a! k% d7 L! `5 g# d        {/ U/ v" }7 `6 l/ X# j4 m+ x: K
                printf("a is %d\n", buf.a);
: i  Z9 E. C! Z, x. F                printf("b is %d\n", buf.b);
6 ]$ U: u. @  d( a                printf("count is %d\n", buf.packet_cout);
: B* H7 u; B- I! p, P                count_copy = buf.packet_cout;
5 }1 k* g5 b- y4 Q& H% @6 y) Q        }
+ i, k6 u! V- p! _8 ?        else1 V; ~6 p) _% D7 L6 w5 z
        {* A" V$ F  v  E8 |
                printf("No effective message!");
* M( W7 k% g  W1 n/ Y) ~- w        }
) o9 F2 U- n0 ~# J8 U* k}
: r: ~2 L1 r# N* K5 e" f1 W. l, \& F; @; @! g  h" @% w
! N) c0 t6 H. a) h: ?  ?
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 _3 {3 j- M; l' y0 K( K使用下面代码,对内存使用了mmap函数后:; _- N0 ~; {6 j$ C* x2 ^
#include <stdio.h>
! U7 w  S2 p) h% {% r#include <unistd.h>
4 x+ s+ m9 d& f8 ~5 w- R#include <sys/mman.h>
3 H+ `: i* F. f1 L# Q7 v#include <sys/types.h>
3 T5 a; V' @' Y# ^6 N9 f5 q#include <fcntl.h>
8 L+ a7 u9 I# L) c, n1 ~' _2 Q  d+ }. |+ n
#define SHAER_RAM_BASE_ADDR    (0x80000000), D) g, y1 Y! l; {
#define SHAER_RAM_SIZE         (0x20000)   
8 g  n6 n# N2 L7 f  G' b% [$ O5 C* @; ?& c; N+ ^
typedef struct+ w. {0 g8 d, y' i! ~3 n- E
{
' j$ C- ]4 h9 y& }3 K        unsigned int a;
/ n0 w4 M/ F0 c" T0 B/ c$ Y7 w( L        unsigned int b;
4 I5 A0 [+ t: ^! ^3 Y; A' k3 h& U        unsigned int packet_cout;
4 ?3 I( G) J1 _& c: |& c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) q. u% Q% ?0 l& C  o3 {# c& g! n& b% n+ c3 K. e2 `
void read_MSG_buffer(int *baseaddr);
/ h( P$ T( {9 s3 u: o0 tunsigned int count_copy = 0;
! X( G0 x+ h1 _' d4 q2 a5 P3 X0 s' R2 W+ x
int main()( f, g* b' c1 d8 W
{
5 F( i1 L  F* E8 k2 ]6 H; E        int fd;
, b. O# u- {- ~* }( p% g        int *mem = NULL;2 h1 v) X! u; T" k/ T

. X8 G& B+ `; C8 Z; G) u        if((fd = open("/dev/mem", O_RDWR)) <0)6 U$ S4 u3 Y7 e
        {. d5 T4 f% m' @! T5 W9 s
                perror("open error");
2 v1 s% u1 M  X; @/ F, G                return -1;4 o. Z6 ?7 p3 Z5 y$ ]+ _$ u
        }7 G& U# G6 S3 o' A* p5 k% Y
        
* `* b+ r4 s1 x- K) K- `" x/ x        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 {5 j* s7 `) U& `6 f- w; s

* F, T- i+ a. ]/ h, s% f) N) P        while(1)
. \& W" T/ z2 N8 M        {/ R9 B' }3 _; p5 i
                read_MSG_buffer(mem);
7 @6 d4 Y5 Z9 \/ M7 e        }                8 p3 w5 s: l; N- S
}
# c& o% y; J3 ^* X4 Q% a
) Y, J6 r6 M/ vvoid read_MSG_buffer(int *baseaddr)
# k  Q1 L, G. ?! l' X' h$ U{
" U/ d5 T4 V. t3 O+ r1 w* H        pRX_MSG_PROTOCOL pshreRAM = NULL;. r1 A% W8 ?; ~: s- x

" D: ?+ Q5 o" [6 H        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 u, C& i3 W" k( K5 B
6 _: K4 N/ `" k; s
        if(pshreRAM->packet_cout != count_copy)
# a  \2 K7 K6 D, m( @7 {        {
: W; e. o" _. A                printf("a is %d\n", pshreRAM->a);
* E& m( w; q# R0 W+ n: t                printf("b is %d\n", pshreRAM->b);/ n4 K2 Y4 t$ Z- G4 t2 g* T
                printf("count is %d\n", pshreRAM->packet_cout);( c' J, ^2 K) k% k4 e3 t8 l4 [
                count_copy = pshreRAM->packet_cout;" d5 m) M" q7 [2 X/ ^* o
        }
( u/ E, T" V, {: h6 S: @        else; R& P- }; r) O& g- J! S
        {& c  v+ y+ ^6 {% W
                printf("No effective message!\n");) W( ?6 I* `0 o
        }
3 V4 X' }$ M* w) F}3 w" P1 i# T/ w

. U. f: p3 o) k  @4 `3 V没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 o+ M2 f, q7 c$ X
7 W* R& b# c' h' R4 g% F
3 ~& T* \# w" |6 ]
% ]0 f. O7 Y8 u2 V+ i, d  G. e# W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-3 21:49 , Processed in 0.039501 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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