OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / {6 s# t: }; X: K+ v

3 g5 R7 n* ?" b( X9 q% v9 {OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! v! P4 f' A- T+ A) d$ o+ i. C( P# L7 p#include <unistd.h>3 F) b8 W& r5 q# C3 h
#include <sys/mman.h>, `% \- Y/ O3 F$ O/ t1 z
#include <sys/types.h>4 T2 t  c( X3 g
#include <fcntl.h>
" i; T* z9 \' ~' `4 H
3 s, F2 g5 m; o2 o#define SHAER_RAM_BASE_ADDR    (0x80000000)   
: J0 P$ `9 a  a! g- h
- d5 C( |% m- H$ y* F0 v$ dtypedef struct3 q- s) D2 C/ s& k
{# o4 t, u! x" c  v! ]
        unsigned int a;7 |3 A  A' L+ o- H. |0 l8 L
        unsigned int b;
# u7 U8 o5 f) S        unsigned int packet_cout;
9 [) g- v% H1 B9 v& F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- }; I: ?9 y: L' L, ~3 b4 x* i& C' O( K. ~6 P$ i! h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 r4 E) B/ c8 S' H0 s/ t. Punsigned int count_copy = 0;; h; Q2 R. _. {2 r( w: f: [
7 C/ ~, @8 O* l, t) s1 R2 V& a
2 z: |3 o6 R: z6 a. k# c/ R% z( Z
int main()
. R+ D) k6 u4 R$ i9 A{( T2 y# ~; G! u+ |# x. q
        pRX_MSG_PROTOCOL pshreRAM = NULL;) \/ p( e& y5 F0 x2 X
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; B* z6 E3 W; M
0 m; ~9 p( @- a9 S0 ?        while(1). X  v; t$ a+ `: a: ^
        {- I! f) k! F) U1 e
                read_MSG_buffer(pshreRAM);& f& j$ Q3 L8 t! W9 [* N& j9 Z) U
        }                7 d, s1 o% f0 V: p4 i
}
% t/ _5 ?3 S3 x) S8 A+ D) P: G/ G! c. b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ i- X( e  b, S: K$ J: `{
' o  k, m! u7 g) H) P) W        RX_MSG_PROTOCOL buf;5 O; q* X  t; s# P( P4 b
        
9 E- h) X4 V! J& s, L        buf.a = pshreRAM->a;% C1 w6 ?( |: z6 ^  s% R+ R' ?1 p, G
        buf.b = pshreRAM->b;
" [$ I4 d6 ]- T  X( A        buf.packet_cout = pshreRAM->packet_cout;8 G# C1 b" H/ o# D. z* v3 `
        
3 g. ?  g. {7 b$ ^; [        if(buf.packet_cout != count_copy)
& k. Y- a% S9 Y* {        {, v% y: V! J% C+ P( v; y6 R
                printf("a is %d\n", buf.a);' i5 V5 P7 D# g
                printf("b is %d\n", buf.b);
7 C0 V; ]- r" ]$ i( r                printf("count is %d\n", buf.packet_cout);) u2 F8 V# ?+ V4 M' Z9 s$ _, m
                count_copy = buf.packet_cout;; }. j! B0 r1 c* z7 K) s, S$ q
        }
7 @/ e: W4 p1 P* Y  P        else) D! }) [! T, H. y
        {6 `6 R9 m+ h1 Q& j+ y# L
                printf("No effective message!");( |0 a0 \1 t4 `* D& L. v9 X
        }
9 |2 q$ R/ T1 D}, b0 Z! t0 R. ^3 c; ~6 c" i( D

! \; n  u- P3 d. h0 X8 u1 S) N
+ S0 U9 Y* v' c  _但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, t# G1 Q4 H5 Y( {# G使用下面代码,对内存使用了mmap函数后:& H8 }( e5 e. I
#include <stdio.h>  I/ r# v: b8 A: [7 p. q4 I
#include <unistd.h>. J9 N. z+ k7 L$ u. ^
#include <sys/mman.h>
( r$ U" s9 S; {( |1 _#include <sys/types.h>
" Z, e4 N% M6 ]7 [4 w' s+ y& @#include <fcntl.h>
0 V" Y& p4 y7 }- u. J" ~1 p  Y' j1 q; d) g7 T* ]$ r
#define SHAER_RAM_BASE_ADDR    (0x80000000)
8 W( R. k0 b: x8 e6 F) U9 n5 Q( F# A#define SHAER_RAM_SIZE         (0x20000)   4 L" b2 G# C& U$ g' K$ H

% K) |4 j5 h! ~typedef struct
: ~9 Y9 q) X8 Y. B5 J' e) x{
* v4 S( c+ i8 r: E+ X        unsigned int a;
' b1 L# P) P; J  n. J! ?- f        unsigned int b;, K& i3 j. H/ H; c+ v* b+ H
        unsigned int packet_cout;
# p' k; Y- T  u6 I1 J6 z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) A  n4 T4 l$ @9 D: k* G; c
6 z8 J0 |5 g. m6 {# ^5 V
void read_MSG_buffer(int *baseaddr);! j3 E8 g5 V0 u& v3 p3 u6 I* t3 }4 L$ y
unsigned int count_copy = 0;
, v* W8 E4 q* ]: j
' N! k! {' D! Q7 tint main()
1 d* B: h% M( ^- N# `{3 d( _  w0 k" g5 K9 Z& a
        int fd;
- \. ~; s2 Q% `+ S& {5 u0 P; n        int *mem = NULL;) s- N8 c% I3 p1 g3 S' f9 Z9 _
1 d  p4 P2 [' j- Y
        if((fd = open("/dev/mem", O_RDWR)) <0)
, F" i" z2 Q. W3 q" t        {
6 H/ o' O" ?* R. c3 g5 J3 L+ o                perror("open error");
' U% @& Z$ K" {) g                return -1;
- y- m1 E+ V! [+ `" w) V  M% U! c        }- l+ X$ K1 B+ |" ?% n% J
        , q! T% `. U/ l9 K
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 M0 j% j) R0 O  [0 R' V6 J4 g
2 i- q. l3 w9 ?2 U        while(1). M' _( M; ^0 M7 I# z6 ~5 C
        {
+ M+ h( Y) N$ W                read_MSG_buffer(mem);
. O6 f8 Q! E( f* `4 x) [3 R        }                , W! u' T1 w% z2 c
}% ^0 V# ?; p1 y( H9 X+ R$ l
$ ?" {7 F" I0 b& r; p
void read_MSG_buffer(int *baseaddr)( @! k# a3 p$ F4 \7 {7 k- v4 F
{
6 n6 Z- X3 F3 y        pRX_MSG_PROTOCOL pshreRAM = NULL;
& [4 @: g% D8 c" E6 X8 ?, K3 i( e  ~, m
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ g+ p0 ^# K. R" g  G4 g0 e! j+ u" R% v2 c' r
        if(pshreRAM->packet_cout != count_copy)6 O+ k; s8 N$ N( Q) y6 ^
        {% b% T" ?+ W  D0 _* b# C' N5 G5 d
                printf("a is %d\n", pshreRAM->a);; }& ~" {1 F( |# N3 W
                printf("b is %d\n", pshreRAM->b);% _$ n, q* w# {% s' s; ^
                printf("count is %d\n", pshreRAM->packet_cout);
0 k0 o# E; R' ^  M, ^! Z$ D                count_copy = pshreRAM->packet_cout;
" P) c+ z" B# e4 T, s        }
/ v2 F6 X& r) T$ Z, v* A  K' x        else
/ b' k+ k" e) B        {
5 B0 q  C; g& ]2 w! R; H/ |                printf("No effective message!\n");
0 e9 W( k* @4 @( f% _7 R, \; A6 }        }
6 ]( M9 `6 g* Q4 K* w5 G}7 k+ r0 S! `* t- S, s$ t

$ K$ S+ g+ R' t- g$ X- T没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% ]3 I1 z  t* M. s) A! N3 G8 G5 q) _/ B9 A0 L
0 E; \- h* P! s5 b9 A
3 i: |) V# q. q$ r! s: n
8 N4 C) B: ^( i5 w# n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-30 20:09 , Processed in 0.050573 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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